2009-10-13 4 views
5

Historisch gesehen, habe ich immerSind PHP MySQLi vorbereitete Abfragen mit gebundenen Parametern sicher?

mysql_real_escape_string() 

für alle Eingaben, die von Benutzern verwendet, die die Datenbank zu berühren landen.

Jetzt, da ich vollständig zu MySQLi konvertiert habe und ich vorbereitete Abfragen mit gebundenen Parametern verwende, habe ich die Möglichkeit von SQL-Injection-Angriffen effektiv eliminiert?

Bin ich korrigiere ich nicht mehr

mysql_real_escape_string()? 

mein Verständnis und die Grundlage für ein Projekt von mir Das ist, müssen sagen: obwohl als http://sourceforge.net/projects/mysqldoneright/files/Base/MysqlDoneRight-0.23.tar.gz/download

Das ist nicht etwas, was ich falsch machen wollen Jetzt, wo ich es veröffentlicht habe, könnte es auch andere betreffen.

Alle vom Benutzer bereitgestellten Eingaben werden jetzt in bind_parms enden.
Die in der Vorbereitungsphase bereitgestellten Abfragen sind statisch.

Antwort

6

Es ist nicht so einfach. Sie können gebundene Parameter verwenden, anstatt Anwendungsvariablen in SQL-Ausdrücke anstelle von Literalwerte von Interpolations- nur:

$sql = "SELECT * FROM MyTable WHERE id = ".$_GET["id"]; // not safe 

$sql = "SELECT * FROM MyTable WHERE id = ?"; // safe 

Aber was, wenn Sie neben einem Literalwert Teil der Abfrage dynamisch machen müssen?

$sql = "SELECT * FROM MyTable ORDER BY ".$_GET["sortcolumn"]; // not safe 

$sql = "SELECT * FROM MyTable ORDER BY ?"; // doesn't work! 

Der Parameter wird immer als Wert und nicht als Spaltenbezeichner interpretiert. Sie können eine Abfrage mit ORDER BY 'score' ausführen, die sich von ORDER BY score unterscheidet, und die Verwendung eines Parameters wird als erster interpretiert - eine konstante Zeichenfolge 'score', nicht der Wert in der Spalte score.

Es gibt also viele Fälle, in denen Sie dynamisches SQL verwenden und Anwendungsvariablen in die Abfrage interpolieren müssen, um die gewünschten Ergebnisse zu erhalten. In diesen Fällen können Abfrageparameter nicht helfen. Sie müssen weiterhin wachsam sein und defensiv codieren, um SQL-Injection-Fehler zu vermeiden.

Kein Framework oder Datenzugriffsbibliothek kann diese Arbeit für Sie erledigen. Sie können immer eine SQL-Abfragezeichenfolge erstellen, die eine SQL-Injektionsfehler enthält, und Sie tun dies, bevor die Datenzugriffsbibliothek die SQL-Abfrage sieht. Wie soll es also wissen, was absichtlich ist und was ein Fehler ist?

Hier sind die Methoden sichere SQL-Abfragen zu erreichen:

  • Filter-Eingang. Verfolgen Sie alle variablen Daten, die in Ihre SQL-Abfragen eingefügt werden. Verwenden Sie die Eingabe filters, um unzulässige Zeichen zu entfernen.Wenn Sie beispielsweise eine ganze Zahl erwarten, stellen Sie sicher, dass die Eingabe auf eine Ganzzahl beschränkt ist.

  • Fluchtausgang. Ausgabe in diesem Kontext kann die SQL-Abfrage sein, die Sie an den Datenbankserver senden. Sie wissen, dass Sie SQL-Abfrageparameter für Werte verwenden können, aber was ist mit einem Spaltennamen? Sie benötigen eine Escape/Quoting-Funktion für Bezeichner, genauso wie die alte mysql_real_escape_string() für String-Werte.

  • Code Bewertungen. Machen Sie jemanden zu einem zweiten Augenpaar und gehen Sie Ihren SQL-Code durch, damit Sie Orte erkennen können, an denen Sie die oben genannten beiden Techniken nicht verwendet haben.

+0

Ja. Bemerken Sie, dass Sie die ORDER BY nicht tun konnten? Bit mit Parametern. Gute Antwort. –

+0

Ich habe einen Downvote? Downvoter, sollten Sie beschreiben, warum Sie denken, dass diese Antwort nicht zufriedenstellend ist. Vielleicht kann ich es verbessern. –

13

Ja. Mit der vorbereiteten Abfrage werden Parameter entfliehen.

+0

Kurz, süß und genau. – ceejayoz

+0

Danke. Ich wollte nur sicherstellen, dass ich nicht etwas Offensichtliches vermisste. Ich neige dazu, das zu tun. –

1

Wenn Sie Parameter an eine vorbereitete Anweisung binden, werden die Daten automatisch ausgeblendet. Sie sollten sie daher nicht vor dem Senden ignorieren. Doppeltes Entkommen ist normalerweise eine schlechte Sache. Zumindest erzeugt es später hässliche Ergebnisse mit zusätzlichen entkleideten Zeichen.

Verwandte Themen