[英]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.