Ist mysql_real_escape_string () defekt?

Einige Leute glauben, dass mysql_real_escape_string() einige Fehler hat und Ihre Abfrage nicht schützen kann, selbst wenn sie richtig verwendet wird.
Einige versteinerte Gegenstände als Beweis bringen.

Die Frage ist also: Ist mysql [i] _real escape_string () völlig inakzeptabel?
Oder ist es immer noch möglich, mit dieser function eigene vorbereitete Aussagen zu erstellen?

Mit Beweiskode, bitte.

Von der MySQL-C-API-function mysql_real_escape_string description :

Wenn Sie den Zeichensatz der Verbindung ändern müssen, sollten Sie die function mysql_set_character_set() verwenden, anstatt eine statement SET NAMES (oder SET CHARACTER SET ) auszuführen. mysql_set_character_set() funktioniert wie SET NAMES , beeinflusst aber auch den von mysql_real_escape_string() verwendeten Zeichensatz, was SET NAMES nicht tut.

Verwenden Sie daher SET NAMES / SET CHARACTER SET sondern PHP mysql_set_charset , um die Codierung zu ändern, da dies das Gegenstück zu MySQL mysql_set_character_set (siehe Quelltext von /ext/mysql/php_mysql.c ).

Die Sicherheitsanfälligkeit kann jedoch auch mit Legacy-Code und alten Serverversionen nur ausgetriggers werden, wenn der Zeichensatz der databaseverbindung von einem Single-Byte-Format wie Latin-1 in ein Multibyte-Format geändert wird, das den Wert 0x5c (ASCII-Anführungszeichen) zulässt ) im zweiten oder späteren Byte eines Multibyte-Zeichens.

Insbesondere UTF-8 erlaubt dies nicht, im Gegensatz zu älteren asiatischen Kodierungen wie GBK und SJIS. Wenn Ihre Anwendung den Verbindungszeichensatz nicht ändert oder nur in UTF-8 oder Single-Byte-Dateien wie Latin-n ändert, sind Sie vor diesem Exploit geschützt.

Aber die beste Methode ist immer noch, die neueste Serverversion auszuführen, die richtige Schnittstelle zum Ändern von Zeichensätzen zu verwenden und vorbereitete Abfragen zu verwenden, damit Sie nicht vergessen, Dinge zu vermeiden.

In den Kommentaren gibt es einen Link zu einem Bugfix in mySQL 5.0.22 (24. Mai 2006) , wo dies behoben wurde.