我看到了经常重复的评论“总是使用准备好的查询来防止SQL注入攻击”。准备查询与构建查询
使用准备好的查询和用户输入始终被消毒的构造查询之间的实际区别是什么?
构建
function quote($value) {
global $db;
return "'" . mysqli_real_escape_string($db, $value) . "'";
}
$sql = "INSERT INTO foo (a, b) VALUES (" . quote($a) . "," . quote($b) . ")";
准备
$stmt = mysqli_prepare($db, "INSERT INTO foo (a, b) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, "ss", $a, $b);
从冗长和风格
除此之外,我想用一个比其他什么原因?
同意,但请注意,因为预备语句的参数从未被服务器解析过SQL,所以通过它们注入SQL是不可能的。而转义方法[已经](http://video.stream/vulnerability/MySQL-SQL-injection-via-multi-byte-characters-5885)(和[仍然受制于](http://stackoverflow.com/) a/12118602))可利用的漏洞,在某些模糊的边缘情况下,可能导致成功的注入攻击。 – eggyal
@eggyal:的确如此。正因如此,如果 - 事实上 - 正如所述的那样恰当地逃脱了,这就是它们在功能上相同的原因。虽然做得好,但通常不是一件容易的事。 – jwueller
在这里,我认为PDO将为每个阅读节省我们所有@eggyal http://stackoverflow.com/a/12118602(** ** Bad **) –