2008-10-23 88 views
4

當用戶的輸入被插入到MySQL查詢中時,用戶輸入中應該替換的危險字符是什麼?我知道引號,雙引號,\ r和\ n。有其他人嗎?
(我沒有選擇使用接受參數的智能連接器,所以我必須自己構建查詢,這將用多種編程語言實現,包括一些模糊的語言,因此PHP中的mysql_real_escape_string等解決方案無效)消毒MySQL用戶參數

+0

@eyelidlessness:PHP,C#.NET 3.0的Java,VB和C(實際上是一個語言自主開發的房子,這是在做什麼它不是專爲太可怕了,但它支持注入C函數爲「特殊」代碼) – Tom 2008-10-23 14:29:18

+0

我其實找到了語言特定的內置轉義函數,但找不到任何相關的C#.NET文檔。如果沒有好的在線文檔,新開發人員應該如何處理它? – eyelidlessness 2008-10-23 14:43:06

+0

如果您在任何時候回來,請切換接受的答案。 micahwittman's比我好。 – eyelidlessness 2009-03-06 08:42:24

回答

7

mysql_real_escape_string()從mysql.com文檔:

在從被編碼爲一個轉義SQL字符串,考慮到當前的字符集的連接的字符串。結果放入並附加一個終止空字節。編碼的字符是NUL(ASCII 0),「\ n」,「\ r」,「\」,「'」,「」「和Control-Z(見第8.1節」文字值「)(嚴格來說, MySQL的只要求反斜槓和用於引用查詢字符串引號字符轉義。這個函數引用了其他字符,使他們更容易閱讀的日誌文件。)


mysql_real_escape_string( )是字符集意識到的,所以複製它的所有能力(特別是針對多字節攻擊問題)不是一個小數目。

http://cognifty.com/blog.entry/id=6/addslashes_dont_call_it_a_comeback.html

 
AS = addslashes() 
MRES = mysql_real_escape_string() 
ACS = addcslashes() //called with "\\\000\n\r'\"\032%_" 

Feature           AS  MRES ACS 
escapes quote, double quote, and backslash  yes yes  yes 
escapes LIKE modifiers: underscore, percent  no  no  yes 
escapes with single quotes instead of backslash no  yes*1 no 
character-set aware        no  yes*2 no 
prevents multi-byte attacks      no  yes*3 no 

4

您需要支持哪些語言?使用語言的內置消毒功能比編寫自己的消毒更好。

編輯:上php.net看mysql_real_escape_string

mysql_real_escape_string()調用MySQL的庫函數mysql_real_escape_string,其中前添加反斜槓以下字符:\x00\n\r\'"\x1a