關於預處理語句的 SQL 注入特性注意事項。
只有當您使用 bindParam 或 bindValue 選項時,預處理語句才能保護您免受 SQL 注入的影響。
例如,如果您有一個名為 users 的表格,其中包含兩個欄位:username 和 email,並且有人更新了他們的使用者名稱,您可能會執行
UPDATE `users` SET `user`='$var'
其中 $var 將是使用者提交的文字。
現在,如果您執行
<?php
$a=new PDO("mysql:host=localhost;dbname=database;","root","");
$b=$a->prepare("UPDATE `users` SET user='$var'");
$b->execute();
?>
如果使用者輸入了 User', email='test,就會發生 SQL Injection,而且 email 也會被更新為 test,user 也會被更新為 User。
使用 bindParam 如下所示:
<?php
$var="User', email='test";
$a=new PDO("mysql:host=localhost;dbname=database;","root","");
$b=$a->prepare("UPDATE `users` SET user=:var");
$b->bindParam(":var",$var);
$b->execute();
?>
SQL 會被跳脫,並將使用者名稱更新為 User', email='test'。