Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql_escape_string Schwachstellen

Die schlechte Antwort:

Nicht zuverlässig. Sie beziehen sich auf mysql_escape_string() , die die Verbindungscodierung nicht berücksichtigt (während mysql_real_escape_string() tut).

Also vielleicht eine sorgfältig erstellte Zeichenfolge mit einem sorgfältig erstellten unvollständigen UTF8-Codepunkt am Anfang vielleicht dazu führen, dass beispielsweise ein Anführungszeichen durch mysql_escape_string() maskiert wird aber das Escape selbst wird von MySQL ignoriert da es es als UTF8-Zeichen "sieht".

Beispiel:

0xC2' OR 1=1 ;--

würde durch mysql_escape_string() maskiert werden als

0xC2\' OR 1=1 ;--

die zusammengesetzt werden würde zu

WHERE password='0xC2\' OR 1=1 ;--';

und von MySQL gesehen (wenn die richtige Verbindungskodierung in Kraft war) als, sagen wir,

WHERE password='€' OR 1=1 ;[--';]    <-- the bracketed part is considered a comment and ignored

das wäre eine klassische SQL-Injection.

Aber das spielt auf die Tatsache an, dass Sie, vielleicht durch Ablenkung, eine doppelt veraltete Funktion angegeben haben . Wenn Sie sich wirklich auf mysql_real_escape_string() bezogen haben , dann würde es nicht funktionieren.

Dies setzt auch voraus, dass weder der Server noch die Anwendungsschicht (z. B. PHP) irgendeine Art von Zeichensatzvalidierung beim Auffüllen der Eingabe verwenden. Wenn dies der Fall wäre, würde das ungültige UTF8 bei der Ankunft gelöscht und von mysql_escape_string nicht einmal gesehen werden , was dann natürlich reichen würde.

Die wahre Antwort:

Verwenden Sie nicht mysql_escape_string (oder mysql_whatever ) überhaupt. Sie sind veraltet und Ihr Code funktioniert möglicherweise nicht mehr. Verwenden Sie stattdessen PDO-Funktionen.