我是否必须使用准备好的SQL语句清理用户输入?

时间:2014-04-24 04:32:56

标签: php mysql pdo

这被认为是完全安全吗?

$stmt = $dbhandler->prepare("update sometable set somefield=:somestring");
$stmt->bindParam(":somestring",$_REQUEST["hack_me_please"],PDO::PARAM_STR);
$stmt->execute();

如果没有,有什么能让它更安全?我假设PDO / MySQL / PHP中存在未知的漏洞,可能会在将来被利用,所以我想知道是否有任何合理的我可以使我的查询更安全,或者它是用我准备好的语句不在我手中。

如果这很容易,为什么SQL注入仍然是一件事?它不应该像脊髓灰质炎一样吗?

2 个答案:

答案 0 :(得分:2)

不,在使用准备好的声明来保护sql注射时,没有必要对输入进行消毒,但如果您出于任何其他原因,可以这样做。

  

如果这很容易,为什么SQL注入仍然是一件事?它不应该像脊髓灰质炎一样吗?

对于那些了解它的人来说很容易,除非你知道,否则没有什么是容易的。我相信sql注射现在不会发生很多。

答案 1 :(得分:1)

您的示例是完全安全的,因为它传递了与查询字符串分开的用户输入参数。 sql注入仍然存在的原因是因为许多用户仍然使用已弃用的mysql_* api /驱动程序并且不知道替代方案。此外,即使使用pdo或mysqli,您仍然可以将用户输入直接传递给查询字符串,而不是单独绑定它。