维基百科说:
准备好的语句对SQL注入具有弹性,因为稍后使用不同协议传输的参数值无需正确转义.如果原始语句模板不是从外部输入派生的,则不能进行SQL注入.
我看不清楚原因.简单的英语和一些例子中有什么简单的解释?
$resultSpendStmt = $connection->prepare(...);
$array->bind_param("sdidi", $A, $B, $C, $D, $E);
$array->execute();
$array->store_result();
$array->bind_result($F, $G, $H, $I, $J, $K);
Run Code Online (Sandbox Code Playgroud)
我仍然不确定bind_param是做什么的.有人能给我一个关于什么意思的例子吗?
我开始知道在使用MySQLi和PDO时预备语句是如何工作的,第一步,我启用了MySQL查询监控,如下所述:我如何查看实时MySQL查询?.然后我创建了以下测试:
使用mysqli:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username =?")) {
$stmt->bind_param("i", $user);
$user = "''1''";
Run Code Online (Sandbox Code Playgroud)
服务器日志:
Run Code Online (Sandbox Code Playgroud)130802 23:39:39 175 Connect ****@localhost on testdb 175 Prepare SELECT * FROM users WHERE username =? 175 Execute SELECT * FROM users WHERE username =0 175 Quit
使用PDO:
$user = "''1''";
$sql = 'SELECT * FROM user WHERE uid =?';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->bindParam(1, $user, PDO::PARAM_INT);
Run Code Online (Sandbox Code Playgroud)
服务器日志:
Run Code Online (Sandbox Code Playgroud)130802 23:41:42 176 Connect ****@localhost on testdb 176 Query SELECT …