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

関連する問題