2012-03-20 51 views
2

我知道使用ORM如构建查询的Doctrine2是安全的,这意味着参数在默认情况下会被转义。这个小Doctrine2动态SQL足够安全的注入吗?

但我猜测,这个用文字时,当这个文字从查询字符串直接来就不是那么明显

$builder = $this->getRepository()->createQueryBuilder('e'); 
    $request = $this->getRequest(); 

    // Loop each allowed filter field and check if exists in $request 
    foreach($this->getFilterFields() as $filter) : 

     // Skip falsy values in $request 
     if(!$value = $request->get($filter)) continue; 

     // Add OR LIKE %$value% where $value is GET paramter 
     $like = $builder->expr()->literal("%$value%"); 
     $builder->orWhere($builder->expr()->like("e.$filter", $like)); 

    endforeach; 

安全应该以某种方式加以改进?

回答

1

$ queryBuilder-> expr返回一个ExpressionBuilder对象。里面的ExpressionBuilder我们发现:

public function literal($input, $type = null) 
{ 
    return $this->connection->quote($input, $type); 
} 

所以文字做得到报价,应该会比较好用。

我们还发现:

public function like($x, $y) 
{ 
    return $this->comparison($x, 'LIKE', $y); 
} 
public function comparison($x, $operator, $y) 
{ 
    return $x . ' ' . $operator . ' ' . $y; 
} 

$ y是很好,因为它通过字面第一。想要小心$ x。只要你的filterFields是内部的就没有问题。如果他们来自用户,那么你需要确保它们是有效的。

+0

谢谢。是的,$ this-> getFilterFields()列出了所有有效的搜索字段,因此任何无效的argumetn都将被忽略。 – Polmonino 2012-03-20 18:48:14