Die anderen Antworten decken bereits das ab, was Sie wissen müssen. Aber vielleicht hilft es, noch etwas zu klären:
Es gibt ZWEI DINGE, die Sie tun müssen:
1. Überprüfen Sie die Formulardaten.
Wie die Antwort von Jonathan Hobbs sehr deutlich zeigt, führt die Auswahl des HTML-Elements für die Formulareingabe zu keiner zuverlässigen Filterung für Sie.
Die Validierung erfolgt normalerweise so, dass die Daten nicht geändert werden, das Formular jedoch erneut angezeigt wird. Die Felder sind mit "Bitte korrigieren" gekennzeichnet.
Die meisten Frameworks und CMS verfügen über Formularersteller, die Sie bei dieser Aufgabe unterstützen. Und nicht nur das, sie helfen auch gegen CSRF (oder "XSRF"), eine andere Form des Angriffs.
2. Bereinigen / Escape-Variablen in SQL-Anweisungen.
.. oder lassen Sie vorbereitete Aussagen die Arbeit für Sie erledigen.
Wenn Sie eine (My) SQL-Anweisung mit vom Benutzer bereitgestellten oder nicht vom Benutzer bereitgestellten Variablen erstellen, müssen Sie diese Variablen maskieren und in Anführungszeichen setzen.
Im Allgemeinen sollte jede solche Variable, die Sie in eine MySQL-Anweisung einfügen, entweder eine Zeichenfolge sein oder etwas, das PHP zuverlässig in eine Zeichenfolge umwandeln kann, die MySQL verarbeiten kann. Wie Zahlen.
Für Zeichenfolgen müssen Sie dann eine von mehreren Methoden auswählen, um die Zeichenfolge zu umgehen. Das heißt, Sie müssen alle Zeichen ersetzen, die in MySQL Nebenwirkungen haben würden.
- In MySQL + PHP der alten Schule erledigt mysql_real_escape_string () den Job. Das Problem ist, dass es viel zu leicht zu vergessen ist, daher sollten Sie unbedingt vorbereitete Anweisungen oder Abfrage-Builder verwenden.
- In MySQLi können Sie vorbereitete Anweisungen verwenden.
- Die meisten Frameworks und CMS bieten Abfrage-Builder, die Sie bei dieser Aufgabe unterstützen.
Wenn Sie es mit einer Zahl zu tun haben, können Sie das Escapezeichen und die Anführungszeichen weglassen (aus diesem Grund können Sie in den vorbereiteten Anweisungen einen Typ angeben).
Es ist wichtig darauf hinzuweisen, dass Sie die Variablen für die SQL-Anweisung und NICHT für die Datenbank selbst maskieren . Die Datenbank speichert die ursprüngliche Zeichenfolge, die Anweisung benötigt jedoch eine maskierte Version.
Was passiert, wenn Sie eines davon weglassen?
Wenn Sie keine Formularvalidierung verwenden , aber Ihre SQL-Eingabe bereinigen, werden möglicherweise alle Arten von schlechten Dingen auftreten, aber Sie werden keine SQL-Injection sehen! (*)
Erstens kann Ihre Bewerbung in einen Zustand versetzt werden, den Sie nicht geplant haben. Wenn Sie beispielsweise das Durchschnittsalter aller Benutzer berechnen möchten, aber ein Benutzer "aljkdfaqer" für das Alter angegeben hat, schlägt Ihre Berechnung fehl.
Zweitens kann es alle Arten von anderen Injektionsangriffen geben, die Sie berücksichtigen müssen: Beispielsweise könnte die Benutzereingabe Javascript oder anderes Material enthalten.
Es kann immer noch Probleme mit der Datenbank geben: ZB wenn ein Feld (Datenbanktabellenspalte) auf 255 Zeichen begrenzt ist und die Zeichenfolge länger ist. Oder wenn das Feld nur Zahlen akzeptiert und Sie versuchen, stattdessen eine nicht numerische Zeichenfolge zu speichern. Dies ist jedoch keine "Injektion", sondern nur ein "Absturz der Anwendung".
Aber selbst wenn Sie ein Freitextfeld haben, in dem Sie Eingaben ohne Validierung zulassen, können Sie diese einfach so in der Datenbank speichern, wenn Sie sie beim Aufrufen einer Datenbankanweisung ordnungsgemäß umgehen. Das Problem tritt auf, wenn Sie diese Zeichenfolge irgendwo verwenden möchten.
(*) oder das wäre etwas wirklich Exotisches.
Wenn Sie Variablen für SQL-Anweisungen nicht entkommen , aber die Formulareingabe validiert haben, können Sie immer noch sehen, dass schlechte Dinge passieren.
Erstens besteht das Risiko, dass beim Speichern und erneuten Laden von Daten in die Datenbank nicht mehr dieselben Daten "verloren gehen".
Zweitens kann dies zu ungültigen SQL-Anweisungen führen und somit Ihre Anwendung zum Absturz bringen. Wenn beispielsweise eine Variable ein Anführungszeichen oder ein doppeltes Anführungszeichen enthält, erhalten Sie je nach verwendetem Anführungszeichentyp eine ungültige MySQL-Anweisung.
Drittens kann es immer noch zu einer SQL-Injection kommen.
Wenn Ihre Benutzereingaben aus Formularen bereits gefiltert / validiert sind, kann eine absichtliche SQl-Injektion weniger wahrscheinlich werden, wenn Ihre Eingabe auf eine fest codierte Liste von Optionen reduziert wird oder wenn sie auf Zahlen beschränkt ist. Jede freie Texteingabe kann jedoch für die SQL-Injection verwendet werden, wenn Sie die Variablen in SQL-Anweisungen nicht ordnungsgemäß umgehen.
Und selbst wenn Sie überhaupt keine Formulareingabe haben, können Sie dennoch Zeichenfolgen aus allen Arten von Quellen haben: Aus dem Dateisystem lesen, aus dem Internet kratzen usw. Niemand kann garantieren, dass diese Zeichenfolgen sicher sind.
<select>
Eingabe zu übermitteln . In der Tat könnte sogar ein etwas technischer Benutzer zusätzliche Optionen über die Browserkonsole hinzufügen. Wenn Sie eine Array-Whitelist mit verfügbaren Werten führen und die Eingabe damit vergleichen, können Sie dies abschwächen (und Sie sollten dies tun, da dies unerwünschte Werte verhindert)