2012-03-20 49 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