Ich möchte eine Funktion haben, die sich wie mysql_real_escape_string verhält, ohne eine Verbindung zur Datenbank herzustellen, da ich manchmal Trockentests ohne DB-Verbindung durchführen muss. mysql_escape_string ist veraltet und daher unerwünscht. Einige meiner Ergebnisse:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
Antworten:
Es ist unmöglich, eine Zeichenfolge ohne DB-Verbindung sicher zu umgehen.
mysql_real_escape_string()
und vorbereitete Anweisungen benötigen eine Verbindung zur Datenbank, damit sie mit dem entsprechenden Zeichensatz aus der Zeichenfolge entkommen können. Andernfalls sind SQL-Injection-Angriffe mit Mehrbyte-Zeichen weiterhin möglich.Wenn Sie nur testen , können Sie auch verwenden
mysql_escape_string()
, es ist nicht 100% garantiert gegen SQL-Injection-Angriffe, aber es ist unmöglich, etwas Sichereres ohne eine DB-Verbindung zu erstellen.quelle
mysql_escape_string
ohne Verbindung verwendet (versucht immer noch herauszufinden, warum). Da diese Funktion veraltet ist, frage ich mich nur, wie ich sie ersetzen kann. Es erscheint sicherlich vernünftig, den "entsprechenden Zeichensatz" in jeder Funktion anzugeben, die ihn ersetzt, ohne eine Verbindung herzustellen.Nun, nach der mysql_real_escape_string Funktionsreferenz Seite: „mysql_real_escape_string () ruft MySQLs Bibliotheksfunktion mysql_real_escape_string, das die folgenden Zeichen entkommt: \ x00, \ n \ r, \,‘, "und \ X1a"
In diesem Sinne sollte die im zweiten Link angegebene Funktion genau das tun, was Sie benötigen:
quelle
mb_strpos()
(undmb_substr()
ein ähnliches Verhalten zu erzeugensubstr_replace()
)?Im direkten Gegensatz zu meiner anderen Antwort ist diese folgende Funktion wahrscheinlich sicher, selbst bei Mehrbyte-Zeichen.
Ich hoffe, jemand, der besser informiert ist als ich, kann mir sagen, warum der obige Code nicht funktioniert ...
quelle
Aus weiteren Untersuchungen habe ich herausgefunden:
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html
Sicherheitsupdate:
Bei der Multi-Byte-Codierungsverarbeitung wurde eine Sicherheitslücke bei der SQL-Injektion gefunden. Der Fehler befand sich auf dem Server und hat die mit der C-API-Funktion mysql_real_escape_string () maskierte Zeichenfolge falsch analysiert.
Diese Sicherheitsanfälligkeit wurde von Josh Berkus und Tom Lane im Rahmen der projektübergreifenden Sicherheitskooperation des OSDB-Konsortiums entdeckt und gemeldet. Weitere Informationen zur SQL-Injection finden Sie im folgenden Text.
Diskussion. Bei der Multi-Byte-Codierungsverarbeitung wurde eine Sicherheitslücke für die SQL-Injektion gefunden. Eine Sicherheitslücke bei der SQL-Injektion kann eine Situation enthalten, in der der Benutzer möglicherweise SQL-Anweisungen in die Daten einfügt, die der Server ausführen wird, wenn ein Benutzer Daten zum Einfügen in eine Datenbank bereitstellt. In Bezug auf diese Sicherheitsanfälligkeit ist es möglich, das Escapezeichen in einigen Multi-Byte-Zeichensätzen (z. B. SJIS, BIG5 und GBK) zu umgehen, wenn Zeichensatz-unbewusstes Escapezeichen verwendet wird (z. B. Addslashes () in PHP). Infolgedessen kann eine Funktion wie addslashes () SQL-Injection-Angriffe nicht verhindern. Es ist unmöglich, dies auf der Serverseite zu beheben. Die beste Lösung besteht darin, dass Anwendungen die Zeichensatz-fähige Escape-Funktion verwenden, die von einer Funktion wie mysql_real_escape_string () angeboten wird.
Es wurde jedoch ein Fehler festgestellt, wie der MySQL-Server die Ausgabe von mysql_real_escape_string () analysiert. Selbst wenn die Zeichensatz-fähige Funktion mysql_real_escape_string () verwendet wurde, war eine SQL-Injection möglich. Dieser Fehler wurde behoben.
Problemumgehungen. Wenn Sie MySQL nicht auf eine Version aktualisieren können, die die Fehlerbehebung beim Parsen von mysql_real_escape_string () enthält, aber MySQL 5.0.1 oder höher ausführen, können Sie den SQL-Modus NO_BACKSLASH_ESCAPES als Problemumgehung verwenden. (Dieser Modus wurde in MySQL 5.0.1 eingeführt.) NO_BACKSLASH_ESCAPES aktiviert einen SQL-Standardkompatibilitätsmodus, in dem Backslash nicht als Sonderzeichen betrachtet wird. Das Ergebnis ist, dass Abfragen fehlschlagen.
Geben Sie die folgende SQL-Anweisung ein, um diesen Modus für die aktuelle Verbindung festzulegen:
Sie können den Modus auch global für alle Clients festlegen:
Dieser SQL-Modus kann auch automatisch aktiviert werden, wenn der Server mit der Befehlszeilenoption --sql-mode = NO_BACKSLASH_ESCAPES oder durch Festlegen von sql-mode = NO_BACKSLASH_ESCAPES in der Serveroptionsdatei (z. B. my.cnf oder my.ini) gestartet wird , abhängig von Ihrem System). (Fehler # 8378, CVE-2006-2753)
Siehe auch Bug # 8303.
quelle
NO_BACKSLASH_ESCAPES
andere Sicherheitslücken entstehen .