Heim > Artikel > Backend-Entwicklung > Ich suche eine ausführliche Erklärung der Anti-Injektion von mysql_real_escape_string()
mysql_real_escape_string() gilt als eine gute Alternative zu addslashes() und mysql_escape_string(), die Wide-Byte- und Injektionsprobleme lösen kann, aber die offizielle Beschreibung ist unklar:
mysql_real_escape_string – Escape-Sonderzeichen in einer Zeichenfolge, die in einer SQL-Anweisung verwendet wird, unter Berücksichtigung des aktuellen Zeichensatzes der Verbindung
Ich verstehe diesen Satz wirklich nicht, wenn man bedenkt, was der aktuelle Zeichensatz der Verbindung bedeutet. Danke!
Referenz:
http://php.net/manual/zh/function.mysql-real-escape-string.php
http://www.cnblogs.com/suihui/archive/2012/ 20.09.2694751.html
http://www.neatstudio.com/show-963-1.shtml
Zusätzliche Fragen: @佢作作作
1. Der hinzugefügte Inhalt wird nicht an MySQL übertragen. Wenn also ' or 1=1;-- s
injiziert wird, wird der hier injizierte Inhalt dann nicht schließlich zur Ausführung an MySQL übertragen? 🎜>Referenz: https://segmentfault.com/q/1010000005994443
Was bedeutet das? Den Zeichensatz der aktuellen Verbindung ändern?并考虑到连接的当前字符集
mysql_real_escape_string – Escape-Sonderzeichen in einer Zeichenfolge, die in einer SQL-Anweisung verwendet wird, unter Berücksichtigung des aktuellen Zeichensatzes der VerbindungIch verstehe diesen Satz wirklich nicht, wenn man bedenkt, was der aktuelle Zeichensatz der Verbindung bedeutet. Danke!
Referenz:
http://php.net/manual/zh/function.mysql-real-escape-string.php
http://www.cnblogs.com/suihui/archive/2012/ 20.09.2694751.html
http://www.neatstudio.com/show-963-1.shtml
1. Der hinzugefügte Inhalt wird nicht an MySQL übertragen. Wenn also
injiziert wird, wird der hier injizierte Inhalt dann nicht schließlich zur Ausführung an MySQL übertragen? 🎜>Referenz: https://segmentfault.com/q/1010000005994443' or 1=1;-- s
2.
并考虑到连接的当前字符集
Wenn sich beispielsweise ein Benutzer anmeldet, nehmen Sie an, dass Ihre SQL-Anweisung lautet:
$sql = "select * from user where user_name='$username' and password='$password'";
1 wenn es einen Einspritzpunkt gibt und kein Entweichen möglich ist. Übergeben Sie den Parameter username=' oder 1=1;-- s, dann lautet die SQL-Anweisung zu diesem Zeitpunkt
$sql = "select * from user where user_name='' or 1=1;-- s ' and password='$password'";
Da -- ein Kommentarzeichen ist, muss später nicht beurteilt werden, ob die Umgehung erfolgreich ist
2 Wenn ein Injektionspunkt vorhanden ist und Sonderzeichen-Escapezeichen verwendet werden. Dann lautet die SQL-Anweisung zu diesem Zeitpunkt
$sql = "select * from user where user_name='' or 1=1;-- s ' and password='$password'";
Kann nicht umgangen werden
3 Zu diesem Zeitpunkt tritt das Problem auf. Ein großartiger Hacker hat entdeckt, dass es bei der GBK-Codierung eine Wide-Byte-Injection gibt. Übergeben Sie zu diesem Zeitpunkt username=�' oder 1=1;--
Die zu diesem Zeitpunkt ausgeführte SQL-Anweisung lautet:
Erfolgreich umgangen
$sql = "select * from user where user_name='運' or 1=1;-- s ' and password='$password'";
So lösen Sie dieses Problem
mysql_real_escape_string – Escape-Sonderzeichen in Zeichenfolgen, die in SQL-Anweisungen verwendet werden, unter Berücksichtigung des aktuellen Zeichensatzes der Verbindung
Der Escape-Mechanismus der
-Anweisung durch die-Methode ändert sich mit der Änderung des Zeichensatzes der aktuellen Datenbankverbindung. Für dieselbe mysql_real_escape_string
-Anweisung sind die Escape-Ergebnisse unter verschiedenen Zeichensätzen möglicherweise nicht dieselben. SQL
SQL
Wichtig:
-Erweiterung, die seit der mysql_real_escape_string
-Version mysql
als veraltet markiert ist und nach der PHP
-Version 5.5.0
entfernt wurde. Bitte verwenden Sie die Erweiterungen PHP
oder 7
für Datenbankoperationen. Bitte versuchen Sie, mysqli
oder PDO
(besser) für den Datenbankzeichensatz zu verwenden. utf8