因為prepare是把sql模板發給mysql編譯,然後execute是把使用者輸入的引數交給mysql套模板執行.php模擬預處理的意思就是資料庫並不會有編譯模板這一步,而是php自動轉義使用者輸入的引數,相當於手動呼叫mysqli_real_escape_string($_get['id']) 或 pdo::quote($_get['id']),比如php的乙個query builder庫medoo.php用的就是pdo::quote轉義使用者輸入的引數後query執行sql.
wireshark裡用tcp.port==3306過濾分析php和mysql通訊可見:
但並非所有資料庫都支援預處理,像sqlite就不支援.
所以php提供了模擬預處理(預設開啟),其本質是轉義使用者輸入,相關函式是:
pdo::quote和mysqli_real_escape_string.
在模擬預處理下,繫結引數(bindparam/bind_param)本質也是轉義,而非sql模板和引數分離.
安全的轉義依賴統一的編碼:
mysqli中需要先用 $mysqli->set_charset('utf8') 定義字符集後,
才能確保 $mysqli->real_escape_string() 能夠安全正確轉義使用者輸入的字串.
pdo_mysql中需要在pdo()中用 charset=utf8 定義字符集後,
才能確保 pdo::quote() 能夠安全正確轉義使用者輸入的字串.
php模擬預處理時,pdo的bindparam/bindvalue/execute轉義時底層用的應該也是pdo::quote().
什麼是sql注入 如何防止sql注入
sql注入 利用現有應用程式,將 惡意 的sql命令注入到後台資料庫執行一些惡意的操作 造成sql注入的原因是因為程式沒有有效過濾使用者的輸入,使攻擊者成功的向伺服器提交惡意的sql查詢 程式在接收後錯誤的將攻擊者的輸入作為查詢語句的一部分執行,導致原始的查詢邏輯被改變,額外的執行了攻擊者精心構造的...
sql 為什麼佔位符可以防止sql注入
為什麼佔位可以防止sql注入,不從什麼預編譯的角度來將,直接上原始碼,下面是mysql jar包中的setstring方法。以select from user where id 語句為例,傳入1 or 1 1 如果是最後sql為select from user where id 1 or 1 1,那...
什麼是SQL注入以及如何防止SQL注入
case 1 模擬使用者登陸案例 1 準備資料 use jt db create table user id int primary key auto increment,username varchar 50 password varchar 50 insert into user values ...