Problem Fall 1:
1 2 | $query = "SELECT * FROM article WHERE id= " . mysql_real_escape_string($_GET['id']) . " LIMIT 1"; |
mysql_real_escape_string maskiert natürlich nur „gefährliche“ Zeichen wie Hochkomme oder Backslash.. trotzdem schützt der Befehl nicht vor einer Injection:
1 | index.php?id=1 OR 1=1 |
1 OR 1=1 somit erfolgt eine Ausgabe durch eine MySQL Injection
Problem Fall 2:
Bypassing mysql_real_escape_string() mit BIG5 oder GBK
Ab folgenden MySQL Versionen ist der folgende Fehler gefixt: MySQL 4.1.20, 5.0.22, 5.1.11
In allen Unterversionen kann eine SQL Injection trotz mysql_real_escape_string durchgeführt werden.
Durch chinesische Zeichen kann der „mysql_real_escape_string“ ausgehebelt werden.
1 2 | $query = "SELECT * FROM users WHERE username='admin' AND passwd='" . utf8_decode(mysql_real_escape_string($_GET['pass'])) . "' LIMIT 1"; |
1 | index.php?passwd=に関する追加情報: |
Nach dieser Eingabe ist eine Anmeldung ohne Passwort möglich, trotz Escapen.
Lösung:
1 | mysql_real_escape_string(utf8_decode($_GET['pass'])) |
utf8_decode vor dem Escapen schützt die Funktion.