DBAL QueryBuilder:避免 SQL 注入的更安全方法是什么?

DBAL QueryBuilder : what is the safier way to avoid SQL injection?

根据 DBAL 文档,只有方法 setFirstResult 和 setMaxResults 被设计为可以安全地避免 SQL 注入。但在 QueryBuilder 部分,他们提到要安全地使用 QueryBuilder,我们必须使用 setParameter 方法传递用户输入。 所以我看到有两种方法可以做到这一点,但我不知道它们是否有真正的区别: 方式一:

$qb->select('USR_id', 'USR_email')
->from('T_user_USR')
->where('USR_email = ? ')
->setParameter(0, $email);
$stmtQb = $qb->execute();
$results = $stmtQb->fetchAll();

方式二:

$qb->select('USR_id', 'USR_email')
->from('T_user_USR')
->where('USR_email = ? ');
$stmtQb = $dbal->prepare($qb->getSQL());
$stmtQb->bindValue(1, $email);
$stmtQb->execute();
$results = $stmtQb->fetchAll();

最好的方法是什么? 提前致谢

这两个例子最终做了同样的事情。也就是说,当您使用 setParameter() 时,参数值绑定到使用 bindValue().

的语句

有关在 DBAL 中执行此操作的内部函数,请参阅 https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Connection.php#L1326-L1356

使用第二种形式的唯一原因是如果您想使用 bindParam() 而不是 bindValue()。如果您想通过引用将参数绑定到 PHP 变量,您可以这样做,例如这样您可以在开始循环之前准备一次查询,然后在循环中多次执行它。

这两种方法针对 SQL 注入提供相同程度的保护。