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 注入提供相同程度的保护。
根据 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 注入提供相同程度的保护。