《PHP學習:PHP中防止SQL注入方法詳解》要點:
本文介紹了PHP學習:PHP中防止SQL注入方法詳解,希望對您有用。如果有疑問,可以聯系我們。
PHP實戰問題描述:
如果用戶輸入的數據在未經處置的情況下插入到一條SQL查詢語句,那么應用將很可能遭受到SQL注入攻擊,正如下面的例子:
PHP實戰 因為用戶的輸入可能是如許的:
PHP實戰 那么SQL查詢將釀成如下:
PHP實戰 應該采取哪些有效的辦法來防止SQL注入?
PHP實戰 最佳回答(來自Theo):
使用預處理語句和參數化查詢.預處理語句和參數分別發送到數據庫服務器進行解析,參數將會被當作普通字符處理.這種方式使得攻擊者無法注入惡意的SQL. 你有兩種選擇來實現該辦法:
PHP實戰 1、使用PDO:
PHP實戰 二、使用mysqli:
PHP實戰 PDO
注意,在默認情況使用PDO并沒有讓MySQL數據庫執行真正的預處理語句(原因見下文).為了辦理這個問題,你應該禁止PDO模擬預處理語句.一個正確使用PDO創建數據庫連接的例子如下:
PHP實戰 在上面的例子中,報錯模式(ATTR_ERRMODE)并不是必需的,但建議加上它.這樣,當發生致命錯誤(Fatal Error)時,腳本就不會停止運行,而是給了程序員一個捕獲PDOExceptions的機會,以便對錯誤進行妥善處理. 然而,第一個setAttribute()調用是必需的,它禁止PDO模擬預處理語句,而使用真正的預處理語句,即有MySQL執行預處理語句.這能確保語句和參數在發送給MySQL之前沒有被PHP處理過,這將使得攻擊者無法注入惡意SQL.了解原因,可參考這篇博文:PDO防注入原理分析以及使用PDO的注意事項. 注意在老版本的PHP(<5.3.6),你無法通過在PDO的構造器的DSN上設置字符集,參考:silently ignored the charset parameter.
PHP實戰 解析
PHP實戰 當你將SQL語句發送給數據庫服務器進行預處理和解析時發生了什么?通過指定占位符(一個?或者一個上面例子中命名的 :name),告訴數據庫引擎你想在哪里進行過濾.當你調用execute的時候,預處理語句將會與你指定的參數值結合. 關鍵點就在這里:參數的值是和經過解析的SQL語句結合到一起,而不是SQL字符串.SQL注入是通過觸發腳本在構造SQL語句時包括惡意的字符串.所以,通過將SQL語句和參數分開,你防止了SQL注入的風險.任何你發送的參數的值都將被當作普通字符串,而不會被數據庫服務器解析.回到上面的例子,如果$name變量的值為 'Sarah'; DELETE FROM employees ,那么實際的查詢將是在 employees 中查找 name 字段值為 'Sarah'; DELETE FROM employees 的記錄. 另一個使用預處理語句的好處是:如果你在同一次數據庫連接會話中執行同樣的語句許多次,它將只被解析一次,這可以提升一點執行速度. 如果你想問插入該如何做,請看下面這個例子(使用PDO):
維易PHP培訓學院每天發布《PHP學習:PHP中防止SQL注入方法詳解》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。