簡體   English   中英

mysql_real_escape_string()是否完全防止SQL注入?

[英]Does mysql_real_escape_string() FULLY protect against SQL injection?

http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat-sheet/?akst_action=share-this上 ,有一節聲稱可以繞過某些亞洲字符編碼的mysql_real_escape_string

用BIG5或GBK繞過mysql_real_escape_string()

“注射線”
に關する追加情報:

上面的字符是中文Big5

這是真的嗎? 如果是這樣,如果您無法訪問預先准備好的聲明,您將如何保護您的網站不受此影響?

根據Stefan Esser的說法, “當使用SET NAMESmysql_real_escape_string()不安全。”

他的解釋來自他的博客

SET NAMES通常用於將編碼從默認編碼切換到應用程序所需的編碼。 這是以mysql_real_escape_string不知道的方式完成的。 這意味着如果你切換到一些允許反斜杠作為第二個第3個第4個...字節的多字節編碼,你會遇到麻煩,因為mysql_real_escape_string沒有正確轉義。 UTF-8很安全......

更改編碼的安全方法是mysql_set_charset ,但這僅適用於新的PHP版本

但他確實提到UTF-8是安全的。

這是一個MySQL服務器錯誤,據報道已於2006年5月修復。

看到:

在MySQL 4.1.20,5.0.22,5.1.11中修復了該錯誤。

如果使用4.1.x,5.0.x或5.1.x,請確保至少已升級到次要修訂號。

作為解決方法,您還可以啟用SQL模式NO_BACKSLASH_ESCAPES ,該模式禁用反斜杠作為引用轉義字符。

我很確定如果使用SQL來更改char編碼,它只會起作用。

正如其他人所證明的那樣, mysql_real_escape_string()可以在不起眼的邊緣情況下被繞過 這是繞過逃逸邏輯的一種已知策略,但可能還有其他尚未發現的未知漏洞。

在PHP中防止SQL注入的簡單而有效的方法是盡可能使用預准備語句 ,並且在不可能的情況下使用非常嚴格的白名單。

准備好的語句,當實際使用而不是由PDO驅動程序模擬時,可證明是安全的(至少在SQL注入方面),因為它們解決了應用程序安全性的基本問題:它們將數據與操作數據指令分開。 它們是分開發送的; 參數化值永遠不會有污染查詢字符串的機會。

這是2015年。不要再逃避和連接了。 您仍應根據應用程序(和業務)邏輯驗證輸入,但只使用預准備語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM