Heim > Datenbank > MySQL-Tutorial > Kann SQL Injection Bypass `mySQL_REAL_ESCAPE_STRING ()` Aufgrund von Zeichen für Zeichencodierung?

Kann SQL Injection Bypass `mySQL_REAL_ESCAPE_STRING ()` Aufgrund von Zeichen für Zeichencodierung?

Barbara Streisand
Freigeben: 2025-01-25 21:22:12
Original
424 Leute haben es durchsucht

Can SQL Injection Bypass `mysql_real_escape_string()` Due to Character Encoding Issues?

Verwendung von Zeichenkodierungsproblemen zur Umgehung der SQL-Injection von mysql_real_escape_string()

Obwohl die mysql_real_escape_string()-Funktion vor SQL-Injection schützt, kann sie unter bestimmten Umständen umgangen werden.

Bedenken Sie den folgenden PHP-Code:

<code class="language-php">$login = mysql_real_escape_string(GetFromPost('login'));
$password = mysql_real_escape_string(GetFromPost('password'));

$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";</code>
Nach dem Login kopieren

Dieser Code scheint sicher zu sein, kann jedoch aufgrund von Randfällen bei der Zeichensatzkodierung ausgenutzt werden.

Angriffsmethode:

Der Angriff basiert auf den folgenden Schritten:

  1. Zeichensatz festlegen: Wählen Sie eine Codierung (z. B. gbk), bei der dieselbe Bytefolge sowohl Nicht-ASCII-Zeichen als auch ASCII-Backslash ('') darstellt.
  2. Erstellen der Nutzlast: Verwenden Sie eine sorgfältig konstruierte Nutzlast, die ungültige Multibyte-Zeichen enthält, und stellen Sie sicher, dass das letzte Byte einen ASCII-Backslash darstellt.
  3. ruft mysql_real_escape_string() auf: Der Client geht davon aus, dass die Verbindung einen anderen Zeichensatz verwendet (z. B. latin1), daher fügt mysql_real_escape_string() einen Backslash vor dem einfachen Anführungszeichen ein, was zu einer syntaktisch gültigen Zeichenfolge führt.
  4. Abfrage senden: Die maskierte Nutzlast wird Teil der SQL-Anweisung, sodass der Angreifer beabsichtigte Schutzmaßnahmen umgehen kann.

So funktioniert es:

Das Hauptproblem besteht darin, dass der vom Server erwartete Zeichensatz nicht mit dem übereinstimmt, was der Client denkt. Obwohl mysql_real_escape_string() gemäß der vom Client festgelegten Verbindungskodierung maskiert wird, werden ungültige Multibyte-Zeichen in einigen Fällen als einzelne Bytes behandelt, einschließlich der Fälle, in denen SET NAMES anstelle von mysql_set_charset() verwendet wird.

Folgen:

Dieser Angriff kann die simulierten vorbereiteten Anweisungen von PDO umgehen, selbst wenn simulierte vorbereitete Anweisungen deaktiviert sind.

Abhilfe:

Die Verwendung eines nicht anfälligen Zeichensatzes wie utf8mb4 oder utf8 kann dieses Problem mildern. Das Aktivieren des SQL-Modus NO_BACKSLASH_ESCAPES bietet ebenfalls Schutz.

Sicheres Beispiel:

Stellen Sie den Zeichensatz immer korrekt ein, indem Sie mysql_set_charset() oder den DSN-Zeichensatzparameter von PDO verwenden. Auch echte vorbereitete Anweisungen in MySQLi sind gegen diesen Angriff immun.

Fazit:

Während mysql_real_escape_string() im Allgemeinen einen starken Schutz bietet, ist es wichtig, sich möglicher Grenzfälle wie diesem bewusst zu sein, um einen vollständigen Schutz vor SQL-Injection zu gewährleisten.

Das obige ist der detaillierte Inhalt vonKann SQL Injection Bypass `mySQL_REAL_ESCAPE_STRING ()` Aufgrund von Zeichen für Zeichencodierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage