wai*_*ani 28 wildcard code-injection dql doctrine-orm sql-like
我想使用参数占位符 - 例如?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
Run Code Online (Sandbox Code Playgroud)
我不喜欢这样,因为没有针对代码注入的保护.
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'));
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个,因为我需要在对象的属性中搜索术语 - 也就是说,我需要两侧的外卡.
Bry*_* M. 72
将参数绑定到查询时,DQL与PDO完全相同(这是Doctrine2在引擎盖下使用的).
因此,在使用LIKE语句时,PDO会将关键字和%通配符视为单个标记.您无法在占位符旁边添加通配符.绑定参数时,必须将它们附加到字符串.
$qb->expr()->like('u.nickname', '?2')
$qb->getQuery()->setParameter(2, '%' . $value . '%');
Run Code Online (Sandbox Code Playgroud)
请参阅PHP手册中的此注释.希望有所帮助.
rob*_*ert 11
选择的答案是错误的。它有效,但不安全。
您应该转义您在百分比符号之间插入的术语:
->setParameter(2, '%'.addcslashes($value, '%_').'%')
Run Code Online (Sandbox Code Playgroud)
百分号“%”和符号下划线“_”被解释为通配符LIKE。如果它们没有正确转义,攻击者可能会构建任意复杂的查询,从而导致拒绝服务攻击。此外,攻击者有可能获得他不应该获得的搜索结果。更详细的攻击场景描述可以在这里找到:https : //stackoverflow.com/a/7893670/623685