Wie Sie sehen, wird empfohlen, allenfalls vorbereitete Erklärungen zu verwenden. Das ist nicht verkehrt, aber wenn Ihre Abfrage ausgeführt wird nur einmal pro Prozess, würde es einen leichten Leistungsverlust geben.
Ich war mit diesem Problem konfrontiert, aber ich glaube, ich habe es in sehr raffinierte Art und Weise - die Art und Weise, die Hacker verwenden, um die Verwendung von Anführungszeichen zu vermeiden. Ich habe dies in Verbindung mit emulierten vorbereiteten Anweisungen verwendet. Ich benutze es, um zu verhindern alle Arten von möglichen SQL-Injection-Angriffen.
Mein Ansatz:
-
Wenn Sie eine ganzzahlige Eingabe erwarten, vergewissern Sie sich, dass es sich um wirklich Ganzzahlig. In einer Sprache vom Typ Variable wie PHP sieht das so aus sehr wichtig. Sie können zum Beispiel diese sehr einfache, aber leistungsfähige Lösung verwenden: sprintf("SELECT 1,2,3 FROM table WHERE 4 = %u", $input);
-
Wenn Sie etwas anderes von integer erwarten es verhexen . Wenn Sie es verhexen, werden alle Eingaben perfekt unterdrückt. In C/C++ gibt es eine Funktion namens mysql_hex_string()
, in PHP können Sie bin2hex()
.
Machen Sie sich keine Sorgen darüber, dass die entkommene Zeichenkette die doppelte Größe ihrer ursprünglichen Länge haben wird, denn selbst wenn Sie mysql_real_escape_string
muss PHP die gleiche Kapazität zuweisen. ((2*input_length)+1)
was dasselbe ist.
-
Diese Hex-Methode wird häufig bei der Übertragung von Binärdaten verwendet, aber ich sehe keinen Grund, sie nicht für alle Daten zu verwenden, um SQL-Injection-Angriffe zu verhindern. Beachten Sie, dass Sie die Daten mit 0x
oder verwenden Sie die MySQL-Funktion UNHEX
stattdessen.
So zum Beispiel die Abfrage:
SELECT password FROM users WHERE name = 'root';
Wird werden:
SELECT password FROM users WHERE name = 0x726f6f74;
o
SELECT password FROM users WHERE name = UNHEX('726f6f74');
Hex ist die perfekte Flucht. Keine Möglichkeit zur Injektion.
Unterschied zwischen der Funktion UNHEX und dem Präfix 0x
Es gab einige Diskussionen in den Kommentaren, deshalb möchte ich es endlich klarstellen. Die beiden Ansätze sind sich sehr ähnlich, aber in mancher Hinsicht unterscheiden sie sich doch ein wenig:
El 0x
Präfix kann nur für Datenspalten verwendet werden wie char
, varchar
, text
, block
, binary
, usw.
Außerdem ist seine Verwendung etwas kompliziert, wenn Sie eine leere Zeichenkette einfügen wollen. Dann müssen Sie sie vollständig ersetzen durch ''
oder Sie erhalten eine Fehlermeldung.
UNHEX()
arbeitet an jede Spalte; Sie müssen sich nicht um die leere Zeichenfolge kümmern.
Verhexungsmethoden werden häufig als Angriffe eingesetzt
Beachten Sie, dass diese Hex-Methode oft für SQL-Injection-Angriffe verwendet wird, bei denen Ganzzahlen wie Zeichenketten behandelt und mit mysql_real_escape_string
. Dann können Sie die Verwendung von Anführungszeichen vermeiden.
Wenn Sie zum Beispiel so etwas tun:
"SELECT title FROM article WHERE id = " . mysql_real_escape_string($_GET["id"])
ein Angriff kann Sie sehr einfach . Betrachten Sie den folgenden eingeschleusten Code, der von Ihrem Skript zurückgegeben wird:
SELECT ... WHERE id = -1 UNION ALL SELECT table_name FROM information_schema.tables;
und jetzt einfach die Tabellenstruktur extrahieren:
SELECT ... WHERE id = -1 UNION ALL SELECT column_name FROM information_schema.column WHERE table_name = __0x61727469636c65__;
Und dann wählen Sie einfach die gewünschten Daten aus. Ist das nicht cool?
Aber wenn der Programmierer einer injizierbaren Website es verhexen würde, wäre keine Injektion möglich, weil die Abfrage wie folgt aussehen würde:
SELECT ... WHERE id = UNHEX('2d312075...3635');