【问题标题】:DBAL QueryBuilder : what is the safier way to avoid SQL injection?DBAL QueryBuilder:避免 SQL 注入的更安全的方法是什么?
【发布时间】:2020-05-05 04:53:39
【问题描述】:

根据 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();

方式 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】:

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

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

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

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

    【讨论】:

    • 感谢您的回答比尔,我有点难以理解 DBAL 的源代码,但我所看到的足以理解我的问题。我现在感到安全了:D
    • 培养阅读其他源代码的技能需要大量练习。但这是一件值得练习的事情!
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 2017-11-10
    • 2015-06-22
    • 1970-01-01
    • 2022-10-15
    • 2017-06-10
    • 1970-01-01
    • 2017-12-02
    相关资源
    最近更新 更多