PDO :: prepare和PDO :: quote完全安全吗?

时间:2017-06-08 21:58:25

标签: php mysql database security pdo

我正在使用PDO包来管理我的应用程序数据库。 我使用PDO::preparePDOStatement::execute和somtimes PDO::quotePDO::query / PDO::exec来执行我的查询

PDO::preparePDO::quote是否完全安全?或者我应该做更多工作来正确验证我的输入。不仅仅是数据库,还有php代码 谢谢

1 个答案:

答案 0 :(得分:2)

使用prepare()没有什么神奇之处。您可以将不安全的变量插入到字符串中,然后准备该字符串。 Boom-SQL注入。准备一份陈述并不能确保安全。

$stmt = $pdo->prepare("SELECT * FROM MyTable WHERE id = {$_POST['id']}"); // UNSAFE!

使用参数安全的原因。

$stmt = $pdo->prepare("SELECT * FROM MyTable WHERE id = ?");
$stmt->execute([$_POST['id']]); // SAFE!

当然,人们会说“使用预准备语句”,因为您必须使用预准备语句来使用参数。但只是说“使用准备好的陈述”有点遗漏了这一点,而且一些开发人员得到了错误的理解。

PDO quote()方法也是安全的,但我发现使用参数更简单,更容易。

$idQuoted = $pdo->quote($_POST['id']);
$stmt = $pdo->prepare("SELECT * FROM MyTable WHERE id = $idQuoted");