2013-05-01 114 views
7

首先,我得到人們想要使用存儲過程,以便他們重用查詢並逃避處理。不過,我讀過很多開發者說,mysqli_real_escape_string不能100%防止SQL注入。有人可以提供一個這樣的例子嗎?mysqli_real_escape_string如何防止SQL注入失敗?

從我關於這個問題的知識有限,我要說的是,mysqli_real_escape_string總是罰款字符串但你可能會被抓出來,除非你覈對一下電話號碼數值是一個整數,浮點,雙等

編輯:我忘了添加一些關鍵的東西:假設字符集是UTF8並且mysqli_set_charset已被相應調用。我見過的唯一注入依賴少數的字符集(沒有一個是UTF8)。

+6

[SQL注入是得到周圍mysql_real_escape_string()( http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) – 2013-05-01 09:00:32

+0

+1,JW爲鏈接。 – 2013-05-01 09:05:09

+0

鏈接的答案太華麗了,我的口味。 – 2013-05-01 09:16:02

回答

6

只要您使用mysqli_set_charset()來設置客戶端編碼,而mysqli_real_escape_string()用於格式字符串只有,它是完全安全的。但是,如果您的問題隱含在應用程序代碼中使用此功能,而不是基於佔位符的查詢的幕後處理,或者至少以PDO的類似功能(其轉義和轉義quote()一次引用)它是直接注入的方式。

它不是功能本身是一個問題,但它的使用方式:

  • 因爲它只有需要格式化的一部分,人們可以很容易忘記另一部分和陷入困境
  • 或者甚至可能很容易被誤用,而不是格式化字符串,而是另一種文字,它根本不會從轉義中受益。第二,當它在應用程序代碼中正確使用時,它的使用會變得不一致或偶爾出現,因爲沒有辦法強制開發人員正確地格式化每一個文字,而不會失敗。這又可能導致不準確和注入。

這就是爲什麼你必須始終使用佔位符在查詢中表示數據(而mysqli_real_escape_string可用於處理此佔位符沒事)

+0

附加警告[必填](http://stackoverflow.com/a/23277864)使用雙引號文字重複「NO_BACKSLASH_ESCAPES」模式。 – eggyal 2014-04-25 14:42:56