Ich verstehe, dass die vorbereiteten Anweisungen der ultimative Weg ist, Schutz gegen die SQL-Injektion suchen. Sie bieten jedoch eine begrenzte Abdeckung; Zum Beispiel in Fällen, in denen ich den Benutzer zu entscheiden, wie die Reihenfolge von Operation zu sein (d. h. ist es ASC oder DESC? etc), bekomme ich keine Berichterstattung dort mit den vorbereiteten Anweisungen.PHP: mit vorbereiteten Anweisungen und Schutz vor SQL-Injektion vs Escape
Ich verstehe, dass ich die Benutzereingabe für eine vordefinierte Whitelist zuordnen kann. Dies ist jedoch nur möglich, wenn zuvor eine Whitelist erstellt oder erraten werden kann.
Zum Beispiel, in den Fällen, die ich oben erwähne (der ASC oder DESC), kann dies leicht zugeordnet und verifiziert werden gegen eine Liste von akzeptierten Werten. Aber gibt es nicht eine Situation, in der der Teil der SQL-Anweisung nicht gegen eine Whitelist verifiziert werden kann?
Wenn eine solche Situation besteht, was ist der empfohlene Ansatz?
Wenn ich die user_input mit dem integrierten Escape-Dienstprogramm der zugrunde liegenden Datenbank (wie mysqL_real_escape_string für mysql) auf der ganzen Linie zu entkommen, wo würde ich scheitern?
ich diese Frage mit der Annahme bin gefragt, dass ich immer meine SQL-Anweisungen mit angegebenen Werte konstruieren - auch für ganze Zahlen ...
Schauen wir uns das folgende Beispiel einen Blick darauf werfen und reflektieren es ..
select {$fields} from {$table} where Age='{$age}' order by {$orderby_pref}
Angenommen, alle Vars werden vom Benutzer bereitgestellt.
Wenn ich zu mysql_real_escape_string alle Variablen in der oben genannten SQL (im Gegensatz zur Verwendung vorbereiteter Aussagen, die mich nur in der Hälfte der Weg zwingt mich zu weißen Listen für die andere Hälfte kommen, dass es nicht helfen kann), wäre es nicht gleichermaßen sicher (und einfacher zu codieren)? Wenn nicht, in welchem Eingabeszenario würde das Escape-Dienstprogramm fehlschlagen?
$fields = mysql_escape($fields);
$table = mysql_escape($table);
$age = mysql_escape($age);
$orderby_pref = mysql_escape($orderby_pref);
select {$fields} from {$table} where Age='{$age}' order by {$orderby_pref}
Upvoted, weil Sie wissen, und kümmern sich um SQL-Injektionen (im Gegensatz zu den meisten Menschen Fragen hier im PHP-Tag) – Mahn
Es gibt einen Unterschied zwischen dynamischen SQL und Hinzufügen von Werten in Abfragen. Beide gebundenen Parameter oder String-Verkettung (plus Escaping) können zum Hinzufügen von Werten verwendet werden. Dynamisches SQL erfordert eine Positivliste für die Positivliste. Verwenden Sie also entweder eine Regex-, eine Map- oder eine switch-Anweisung, um 'DESC' oder' ORDER' und andere Qualifier hinzuzufügen. Gespeicherte Verfahren wären jedoch eine langatmige Alternative. – mario