Dies ist eine sehr beliebte Frage zum Stapelüberlauf, und deshalb habe ich eine Art "Standardantwort" darauf entwickelt.
1. Warum versuchen Sie zu verhandeln?
Zunächst einmal klingt die Frage so, als würden Sie versuchen, sich einen "Rabatt" in der Entwicklung auszuhandeln. Aber warum versuchst du es so? Warum stellt sich jemals eine solche Frage? Sind vorbereitete Aussagen für Sie zu schwer zu erfassen / umzusetzen? Dann sollten Sie eine andere Frage stellen: "Wie mache ich vorbereitete Aussagen weniger langweilig?" Tatsächlich ist eine vorbereitete Anweisung einfacher als jede andere Methode der Datenbankinteraktion.
Daher gibt es überhaupt keinen Grund für eine solche Frage.
2. SQL-Injection ist nur ein Nebeneffekt .
Sie müssen Ihre Abfragen unabhängig von möglichen Bedrohungen formatieren. Sie tun es nicht für die berühmten Bobby Tables, sondern für ein bescheidenes Mädchen, Sarah O'Hara (oder einen anderen Menschen oder eine andere Entität, die zufällig einen Namen trägt, der eine Datenbank erstellen könnte Choke, wenn nicht richtig formatiert).
Es handelt sich also nicht um eine SQL-Injection, für die Sie vorbereitete Anweisungen verwenden müssen, sondern lediglich, um sicherzustellen, dass Ihre Abfrage immer syntaktisch korrekt ist.
3. Es gibt zu viele mögliche Fallstricke bei der manuellen Formatierung.
Wenn Sie keine vorbereiteten Anweisungen verwenden, sind Sie damit abgefunden, Ihre Daten manuell zu formatieren, und auf diesem Weg gibt es viele Fallstricke. Ich habe mich bemüht, sie in meinem Artikel über SQL-Injection zusammenzufassen. Hier ein Auszug:
-
Die manuelle Formatierung kann unvollständig sein.
Nehmen wir den Fall der Bobby Tables. Es ist ein perfektes Beispiel für unvollständige Formatierung: Eine Zeichenfolge, die wir der Abfrage hinzugefügt haben, wurde nur in Anführungszeichen gesetzt, aber nicht maskiert! Während, wie wir gerade aus dem oben Gesagten gelernt haben, Zitieren und Escaping immer zusammenpassen sollten (zusammen mit der Einstellung der richtigen Codierung für die Escape-Funktion). In einer üblichen PHP-Anwendung, die die SQL-Zeichenfolgenformatierung separat ausführt (teilweise in der Abfrage und teilweise an einer anderen Stelle), ist es sehr wahrscheinlich, dass ein Teil der Formatierung einfach übersehen wird.
-
Manuelle Formatierung kann auf das falsche Literal angewendet werden. Keine große Sache, solange wir vollständige Formatierung verwenden (da dies einen sofortigen Fehler verursacht, der behoben werden kann die Entwicklungsphase), aber in Kombination mit unvollständiger Formatierung ist es eine echte Katastrophe. Auf der großartigen Website von Stack Overflow gibt es Hunderte von Antworten, die vorschlagen, Identifikatoren genauso wie Zeichenfolgen zu entkommen. Dies wäre völlig nutzlos und würde eine SQL-Injektion verursachen.
-
Die manuelle Formatierung ist im Wesentlichen eine nicht obligatorische Maßnahme. Zunächst einmal gibt es eine offensichtlicher Mangel an Aufmerksamkeit, bei dem die richtige Formatierung einfach vergessen werden kann. Aber es gibt einen wirklich seltsamen Fall: Viele PHP-Benutzer lehnen es absichtlich ab, Formatierungen anzuwenden, da sie die Daten bis heute in "bereinigen" und "unsauber", "Benutzereingaben" und "getrennt" trennen "Nichtbenutzereingaben" usw. Ich denke, dass "sichere" Daten keine Formatierung benötigen. Was ein einfacher Unsinn ist - erinnern Sie sich an Sarah O'Hara. Aus Sicht der Formatierung ist das Ziel wichtig. Ein Entwickler muss den Typ des SQL-Literal beachten, nicht die Datenquelle. Geht eine Zeichenfolge zur Abfrage? Es muss dann als String formatiert werden. Egal, ob es sich um Benutzereingaben handelt oder nur auf mysteriöse Weise aus dem Nichts inmitten der Codeausführung aufgetaucht ist.
-
Die manuelle Formatierung kann durch einen beträchtlichen Abstand von der tatsächlichen Abfrageausführung getrennt werden.
ol> Das am meisten unterschätzte und übersehene Problem. Das Wichtigste von allen ist jedoch, dass es alle anderen Regeln allein verderben kann, wenn es nicht befolgt wird.
Fast jeder PHP-Benutzer ist versucht, die gesamte "Desinfektion" an einem einzigen Ort durchzuführen, weit weg von der Die tatsächliche Ausführung von Abfragen und ein derart falscher Ansatz sind allein eine Quelle für unzählige Fehler:
4. Eine vorbereitete Aussage ist keine Silberkugel.
Zu guter Letzt. Wir alle müssen uns daran erinnern, dass Datenliterale nicht die einzigen variablen Teile in der Abfrage sind. Manchmal muss auch ein Bezeichner oder ein Schlüsselwort hinzugefügt werden. Vorbereitete Anweisungen helfen in diesem Fall nicht weiter, dennoch sollten solche Abfrageteile insgesamt nicht weniger geschützt sein. Glücklicherweise ist die Liste der möglichen Varianten für Bezeichner und Schlüsselwörter immer begrenzt, sodass wir den Whitelisting -Ansatz verwenden können, den ich in meiner Antwort auf die Referenzfrage zum Stapelüberlauf a beschrieben habe >, damit ich mich nicht wiederhole.
Um Ihre letzte Frage zu beantworten - nein, eine Abfrage ohne variable Teile ist nicht anfällig, da es keinen Grund zum Injizieren gibt.