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>
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:
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. 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!