学说2 dql,在进行类似比较时使用带有%通配符的setParameter
Posted
技术标签:
【中文标题】学说2 dql,在进行类似比较时使用带有%通配符的setParameter【英文标题】:doctrine2 dql, use setParameter with % wildcard when doing a like comparison 【发布时间】:2011-04-14 22:02:50 【问题描述】:我想使用参数占位符 - 例如?1 - 带有 % 通配符。也就是说,类似于:“u.name LIKE %?1%”(尽管这会引发错误)。文档有以下两个示例: 1.
// Example - $qb->expr()->like('u.firstname', $qb->expr()->literal('Gui%'))
public function like($x, $y); // Returns Expr\Comparison instance
我不喜欢这样,因为没有针对代码注入的保护。
2.
// $qb instanceof QueryBuilder
// example8: QueryBuilder port of: "SELECT u FROM User u WHERE u.id = ?1 OR u.nickname LIKE ?2 ORDER BY u.surname DESC" using QueryBuilder helper methods
$qb->select(array('u')) // string 'u' is converted to array internally
->from('User', 'u')
->where($qb->expr()->orx(
$qb->expr()->eq('u.id', '?1'),
$qb->expr()->like('u.nickname', '?2')
))
->orderBy('u.surname', 'ASC'));
我不喜欢这样,因为我需要在对象的属性中搜索术语——也就是说,我需要两边都有通配符。
【问题讨论】:
【参考方案1】:所选答案错误。它有效,但它不安全。
您应该转义在百分号之间插入的术语:
->setParameter(2, '%'.addcslashes($value, '%_').'%')
LIKE
将百分号“%”和下划线“_”符号解释为通配符。如果它们没有正确转义,攻击者可能会构建任意复杂的查询,从而导致拒绝服务攻击。此外,攻击者可能会获得他不应该获得的搜索结果。更详细的攻击场景描述可以在这里找到:https://***.com/a/7893670/623685
【讨论】:
【参考方案2】:在将参数绑定到查询时,DQL 的工作方式与 PDO 非常相似(这是 Doctrine2 在后台使用的)。
因此,当使用 LIKE 语句时,PDO 将关键字和 % 通配符视为单个标记。您不能在占位符旁边添加通配符。绑定参数时必须将它们附加到字符串中。
$qb->expr()->like('u.nickname', '?2')
$qb->getQuery()->setParameter(2, '%' . $value . '%');
请参阅 php 手册中的 comment。希望对您有所帮助。
【讨论】:
如果$value = '\\'
会发生什么?
安全吗? $value 之前应该以某种方式转义吗?
@MacDada 不,它不安全。看我的回答。以上是关于学说2 dql,在进行类似比较时使用带有%通配符的setParameter的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 学说 DQL 随机结果在使用 MaxResult 的查询中