2016-10-05 3 views
0

Ich verwende den Doctrine QueryBuilder in meinem Silex-Projekt. Ich erstelle eine Abfrage, die vollständig auf Benutzereingaben basiert. Die Parameter sind mit der Funktion setParameter() ausgeblendet. Aber wie wäre es mit der addSelect()?Doctrine QueryBuilder addSelect mit Benutzereingabe

Das kann ich nicht herausfinden, sparen ist es, so etwas zu tun:

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

Wird diese SQL-Injektion in der SELECT verhindern?

+0

Können Sie einen Parameter nicht verwenden? 'addSelect (': userInputCol1')' – Veve

+0

@Veve Nein. Dann wird es in einfachen Anführungszeichen maskiert – Timo002

Antwort

1

Im Allgemeinen würde ich Benutzereingabe nicht direkt in eine QueryBuilder-Methode übergeben, sogar es zu entkommen. Ich würde so etwas tun:

$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 

Es ist ein bisschen ausführlicher, aber es ist viel mehr defensiv - vielleicht könnte es eine Spalte sein, dass Abfrage aussetzen könnte, dass Sie würde nie ein Benutzer möchte in der Lage zu sehen - diese Ansatz vermeidet dieses Problem.

+0

Das ist in der Tat wahr. Ich werde das Problem beheben. – Timo002