即使使用mysql_real_escape_string(),SQL注入仍然可能發生
儘管普遍認為mysql_real_escape_string()可以防止SQL注入,但在特定情況下,SQL注入仍然可能發生。以下解釋了這種攻擊是如何發生的:
-
字符集選擇:
- 將服務器字符集設置為允許ASCII反斜杠(0x5c)和無效多字節字符的字符集(例如,gbk)。這可以通過SET NAMES語句實現。
-
有效載荷構建:
- 創建一個以0xbf27開頭的有效載荷。在指定的字符集(例如,gbk)中,這表示一個無效的多字節字符,它在Latin1中將轉換為0x27(撇號)。
-
mysql_real_escape_string()操作:
- mysql_real_escape_string()基於連接的字符集(GBK)操作,而不是客戶端假定的字符集(Latin1)。
- 它將有效載荷轉義為0x5c27,假設它是一個反斜杠後跟一個撇號。但是,由於客戶端仍然認為它使用的是Latin1,所以反斜杠(0x5c)仍然未轉義。
-
查詢執行:
- 渲染後的查詢在轉義的內容中包含一個未轉義的撇號,從而導致成功的注入攻擊。
PDO和MySQLi中的漏洞:
- PDO默認使用模擬預處理語句,容易受到此攻擊。
- MySQLi不受影響,因為它使用真正的預處理語句。
緩解措施:
- 使用非易受攻擊的字符集進行連接編碼(例如,utf8)。
- 使用mysql_set_charset() / PDO DSN字符集參數正確設置連接字符集。
- 禁用PDO中的模擬預處理語句。
通過驗證以下條件:
- 使用具有正確字符集管理的現代MySQL版本
- 或使用非易受攻擊的字符集
您可以減輕這種潛在的漏洞。
以上是即使使用`mysql_real_escape_string()`即使SQL注入仍然會發生?的詳細內容。更多資訊請關注PHP中文網其他相關文章!