Heim >Backend-Entwicklung >PHP-Tutorial >Verhindert „mysql_real_escape_string()' wirklich die SQL-Injection?

Verhindert „mysql_real_escape_string()' wirklich die SQL-Injection?

Susan Sarandon
Susan SarandonOriginal
2024-12-27 11:20:12346Durchsuche

Does `mysql_real_escape_string()` Really Prevent 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn