簡體   English   中英

mysqli預處理語句和mysqli_real_escape_string

[英]mysqli prepared statements and mysqli_real_escape_string

我目前正在使用mysqli php擴展。

傳統上我使用mysqli_real_escape_string來逃避用戶輸入。 但是,我正在考慮更改代碼(希望盡可能少的步驟)來使用預准備語句。

我想明確這一點 - 假設我使用預處理語句來綁定我的所有變量,我可以確信sql注入是不可能的嗎? (並完全免除mysqli_real_escape_string?)

謝謝

如果正確綁定所有變量,則可以顯着降低SQL注入的風險。 如果您動態創建SQL,仍然可以獲取SQL注入,例如:

'SELECT * FROM ' . $tablename . ' WHERE id = ?'

但如果你避免這樣的事情,你就不會有問題。

說到安全性,如果正確綁定或格式化變量,兩種方法之間沒有區別。

綁定只是更簡單,因為它可以只用於任何情況,而轉義不能(所以,你必須轉換一些變量而不是轉義/引用)。

另外,請記住,沒有綁定或轉義可以使標識符安全。 因此,如果必須在查詢中使用字段名稱或運算符,則必須在腳本中使用硬編碼的值。

這是我對該主題的高級別觀點。

使用動態SQL字符串時,您依賴於轉義函數正常工作。 不幸的是,情況並非總是如此,正如在這個(不可否認的舊)例子中可以看到的那樣:

http://dev.mysql.com/doc/refman/5.0/en/news-5-0-22.html

一旦數據值被轉義,SQL字符串就必須由數據庫服務器進行解析和編譯。 如果轉義函數沒有正確完成其工作,或者發現了一個聰明的新SQL注入攻擊,服務器可能會將數據誤認為是SQL語句。

如果使用帶參數的預准備語句,則首先解析和編譯該語句。 執行時,數據值與編譯語句組合在一起。 這將SQL邏輯與數據值分開 - 應該永遠不會混淆兩者的機會。

所以,是的,你可以省去mysqli_real_escape_string ,但是我不會說使用帶參數的預處理語句會導致SQL注入無法進行。 它使得它變得更加困難,但是與mysqli_real_escape_string錯誤一樣,我想總是有可能一個尚未被發現(或新創建的)錯誤會使看似不可能的錯誤成為可能。

暫無
暫無

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

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