mysql占位符 防注入_php mysql中防注入的几个小问题,麻烦大大帮我解答谢谢
問:為什么第一種方式沒有進行一個參數類型的綁定,那服務器怎么知道傳過來的參數是不是合法?
回答:
PHP是若類型語言,無需強制指定數據類型.
用戶名,密碼這樣的參數是否合法,屬于業務上的校驗.上面的代碼只是舉例說明PDO防范SQL注入的使用.
圖片中的兩種寫法,并沒有本質上的區別. 但第二種寫法,更規范些.
-------------------------------------------------------------------
問:為什么通過占位符的一個形式就能實現sql的防注入?
回答:
占位符,可以用冒號: 可以用問號? ?這只是表現出來的一種形式. 不僅僅是pdo,更早的mysqli也可以使用類似方式來防范sql注入.
但pdo能夠防范sql注入的本質原因是請看我下面的回答:
簡單來講,就是
使用預處理語句 和 參數化查詢.
預處理語句和參數分別發送到數據庫服務器進行解析,參數將會被當作普通字符處理。
這種方式使得攻擊者無法注入惡意的SQL。
sql語句解析的過程:
當你將SQL語句發送給數據庫服務器進行預處理和解析時發生了什么?
通過指定占位符(一個?或者一個上面例子中命名的 :username),告訴數據庫引擎你想在哪里進行過濾。
當你調用execute的時候,預處理語句將會與你指定的參數值結合。
關鍵點就在這里:參數的值是和經過解析的SQL語句結合到一起,而不是SQL字符串。
SQL注入是通過觸發腳本在構造SQL語句時包含惡意的字符串。
所以,通過將SQL語句和參數分開,從而防止了SQL注入的風險。
任何你發送的參數的值都將被當作普通字符串,而不會被數據庫服務器解析。
回到上面的例子,如果$username變量的值為 'zhangsan@xx.com'; DELETE FROM user,那么實際的查詢將是在 user表中查找 name 字段值為?'zhangsan@xx.com'; DELETE FROM user? 的記錄。
這就是神奇之處,可見pdo是將SQL語句模板和變量是分兩次發送給MySQL引擎的,
由MySQL引擎完成變量的轉義處理,既然變量和SQL模板是分兩次發送的,那么就不存在SQL注入的問題了
花了20分鐘,碼字不易,若對你有幫助,請點贊,謝謝.
若有疑問,請繼續追問. 感謝閱讀.(*゚?゚*)
總結
以上是生活随笔為你收集整理的mysql占位符 防注入_php mysql中防注入的几个小问题,麻烦大大帮我解答谢谢的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts2 mysql 分页代码_S
- 下一篇: asp dsn mysql 连接失败_A