2016-10-05 7 views
0

私はSilexプロジェクトでDoctrine QueryBuilderを使用しています。私は完全にユーザーの入力に基づいて、クエリを構築しています。パラメータはsetParameter()関数でエスケープされます。でも、addSelect()はどうですか?Doctrine QueryBuilder addSelect with user input

私はこれを把握することはできませんが、それはこのような何かを保存している:

$stmt = $this->conn->createQueryBuilder() 
    ->addSelect("`".$userinputCol1."`") 
    ->addSelect("`".$userinputCol2."`") 
    ->from('`mytable`') 
    ->where('id = :id') 
    ->setParameter('id', $userinputId) 
    ->execute(); 

これはSELECTでSQLインジェクションを防ぐためだろうか?

+0

パラメータを使用できませんか? 'addSelect( ':userInputCol1')' – Veve

+0

@Veve No.その後、一重引用符でエスケープされます – Timo002

答えて

1

一般に、私はユーザー入力をそのままQueryBuilderメソッドに渡すことはありません。エスケープすることさえできます。 - おそらくクエリは、ユーザーが見ることができるようにしたいことはないことを公開することができると列があるかもしれない - この

$possibleSelectFields = ['name', 'dob', 'created', 'something']; 
    if (!in_array($userInputCol1, $possibleSelectFields) || !in_array($userInputCol2, $possibleSelectFields)) { 
     throw new \Exception("Throw an exception, or just silently ignore the user\'s input - depending on how bad this situation is for your application."); 
    } 

    //...Your code as before 

それは少し冗長なのですが、それははるかに守備のだ:私はこのような何かをするだろうアプローチはその問題を回避する。

+0

それは確かに真です。私はその問題をに解決します。 – Timo002