猿问

DBAL QueryBuilder:避免SQL注入的safier方法是什么?

根据 DBAL 文档,只有 setFirstResult 和 setMaxResults 这两种方法被设计为对 SQL 注入是安全的。但是在QueryBuilder部分,他们提到要安全地使用QueryBuilder,我们必须使用setParameter方法传递用户输入。所以我看到了2种方法来做到这一点,但我不知道它们是否有真正的区别:方式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();

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


慕村225694
浏览 97回答 1
1回答

呼唤远方

这两个示例最终执行相同的操作。也就是说,当您使用参数值时,将使用 绑定到语句。setParameter()bindValue()请参阅 https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Connection.php#L1326-L1356,了解在 DBAL 中执行此操作的内部函数。使用第二种形式的唯一原因是,如果要使用 而不是 。如果要通过引用将参数绑定到 PHP 变量,则可以执行此操作,例如,您可以在启动循环之前准备一次查询,然后在循环中多次执行它。bindParam()bindValue()这两种方法在 SQL 注入方面提供相同程度的保护。
随时随地看视频慕课网APP
我要回答