Auslassen des Spaltennamens mit PDO

8

Ich habe eine Funktion wie

%Vor%

Die Idee besteht darin, eine Abfrage als "SELECT $info FROM table WHERE id = $id"

zu haben

Dies funktioniert nicht mit PDO, weil Sie Spaltennamen nicht entziehen können. Ich möchte auch nicht wirklich "SELECT *" verwenden, weil das nicht eine größere Ergebnismenge zurückgibt und mehr Speicher verwendet?

    
Steve 19.11.2012, 05:39
quelle

2 Antworten

14

Ja, PDO verfügt nicht über eine eingebaute Funktion zur Begrenzung von Bezeichnern wie Tabellennamen und Spaltennamen. Die Funktion PDO::quote() ist nur für String-Literale und Datumsliterale verfügbar.

Für was es wert ist, als ich an Zend Framework gearbeitet habe, habe ich eine quoteIdentifier() Funktion implementiert.

Sie haben Recht, dass SELECT * alle Spalten abruft, wahrscheinlich mehr Speicher verbraucht und den Vorteil der Abdeckung von Indizes zunichte macht.

Ich empfehle die Whitelist Spaltennamen. Das heißt, stellen Sie sicher, dass $ info tatsächlich eine Spalte von table benennt. Dann müssen Sie sich keine Gedanken darüber machen, dass der Spaltenname nicht existiert oder ein seltsames Zeichen oder irgendetwas enthält. Sie können die Menge der Spalten steuern, die legitimiert sind, in die Abfrage einzutragen.

Sie sollten den Spaltennamen trotzdem abgrenzen. Begrenzte Bezeichner sind erforderlich, wenn der Spaltenname Interpunktion, Leerzeichen, internationale Zeichen oder ein mit SQL reserviertes Wort enthält. Siehe Verwenden unterschiedliche Datenbanken einen anderen Namen?

%Vor%

Ich zeige mehr Beispiele für Whitelisting in meiner Präsentation SQL Injection Mythen und Irrtümer .

    
Bill Karwin 19.11.2012, 05:57
quelle
5

Ich würde es nur mit einem Regex ausfiltern. Halte es einfach.

Außerdem sollten Sie $id binden und% ce_de%

haben %Vor%     
wesside 19.11.2012 05:45
quelle

Tags und Links