Heim >Backend-Entwicklung >PHP-Tutorial >Verhindert „mysql_real_escape_string()' wirklich die SQL-Injection?
Ist mysql_real_escape_string() zur Verhinderung von SQL-Injection ausreichend?
Während viele glauben, dass der Einsatz von mysql_real_escape_string() einen Schutz vor SQL-Injection bietet, gibt es tatsächlich einen solchen eine Umgehungsmöglichkeit.
Die Fehler
In bestimmten Fällen, wie zum Beispiel:
mysql_query('SET NAMES gbk'); $var = mysql_real_escape_string("\xbf\x27 OR 1=1 /*"); mysql_query("SELECT * FROM test WHERE name = '$var' LIMIT 1");
Das Problem entsteht aufgrund einer Diskrepanz zwischen dem erwarteten Zeichensatz des Servers und der Wahrnehmung des Clients. Durch die Verwendung von „SET NAMES“ zum Ändern des Zeichensatzes auf dem Server kann mysql_real_escape_string() wie in ASCII mit Escapezeichen versehen werden, während der Server es als Klartext erwartet. Dadurch entsteht eine Diskrepanz, die ein freihängendes ' und Injektionen ermöglicht.
Das Schlechte
PDOs Standardemulation vorbereiteter Anweisungen kann ebenfalls zu dieser Lücke führen. Es wird empfohlen, die Emulation zu deaktivieren, aber ein Rückgriff auf die Emulation bei nicht unterstützten Abfragen kann den vollständigen Schutz verhindern.
The Ugly
Vor MySQL 4.1.20 erlaubte ein Fehler ungültige Multibyte-Zeichen wie diejenigen, die in der Nutzlast zu sehen sind, auch mit dem richtigen Client-Zeichensatz als einzelne Bytes maskiert werden Informationen.
The Saving Grace
Die Verwendung undurchlässiger Zeichensätze wie utf8mb4 oder utf8 oder die Aktivierung des SQL-Modus NO_BACKSLASH_ESCAPES bietet Schutz davor Sicherheitslücke.
Schlussfolgerungen
Der Einsatz von mysql_real_escape_string() bleibt in vielen Situationen effektiv, aber es ist wichtig, sich potenzieller Grenzfälle bewusst zu sein. Die Verwendung sicherer Techniken wie Aufzählungsfelder und vorbereiteter Anweisungen sowie die richtige Zeichensatz- und Moduskonfiguration sind für einen umfassenden SQL-Injection-Schutz unerlässlich.
Das obige ist der detaillierte Inhalt vonVerhindert „mysql_real_escape_string()' wirklich die SQL-Injection?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!