【发布时间】:2017-04-22 12:08:39
【问题描述】:
我在Symfony 2.8 项目中使用Doctrine,我想知道在使用queryBuilder 的addOrderBy() 方法时是否存在SQL 注入风险:
// Order options. Real code does not specify this manually, but receives
// the options via user form input
$orderBy' = array(
'column1' => 'ASC',
'column2' => 'DESC',
...
'columnN' => 'ASC',
);
$qb = $this->em->createQueryBuilder();
...
foreach ($orderBy as $column => $orderOption) {
$qb->addOrderBy("e.$column", $orderOption);
// Does not work:
// $qb->addOrderBy("e.$column", ':orderOption')
// ->setParameter('orderOption', $orderOption);
//
// Error: Expected end of string, got ':orderOption'"
}
// Result is something like:
...ORDER BY e0_.column1 ASC, e0_.column2 DESC...
问题在于,订单选项是通过用户表单输入接收的,可以将其操作为 ; DROP TABLE someTable 而不是 ASC 或 DESC。
我已经尝试过了,但是查询生成器似乎不接受由; 分隔的多个查询,这并不意味着不可能有任何其他/更好的注入 :-)
当然,通过过滤收到的结果并跳过所有无效的搜索选项,可以轻松解决问题。但我想了解,如果一般是addOrderBy() 方法。 将任何值传递给方法是否省钱,Doctrine 会处理其余部分,还是存在潜在风险?
我想知道为什么 ->setParameter() 方法不起作用,就像使用 ->where() 时一样。
【问题讨论】:
标签: php symfony doctrine-orm sql-injection