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

问题描述 投票:0回答:1

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

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

方式2:

$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();

最佳方法是什么?在此先感谢

php doctrine sql-injection query-builder dbal
1个回答
0
投票

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

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

[这两种方法在SQL注入方面都提供相同数量的保护。

© www.soinside.com 2019 - 2024. All rights reserved.