Moin!
Ich habe gerade ein Formular getestet, indem ich die Hacker-Zeile
<script>alert('CSS Vulnerable')</script>
als Eingabe eines böswilligen Users in einen input der Form
<INPUT TYPE="text" NAME="var">
eingegeben habe.
Das ist im Grunde eine sehr gute Idee - und es zeigt sich ja in der Folge, dass du ein Problem in deinem Code hast.
Das Formular wird mit einen PHP-Script abgearbeitet, welches den input wie folgt übernimmt:
$var= htmlentities(trim($_POST["var"]));
htmlentities() ist für den HTML-Kontext gedacht: Wenn ein String, der möglicherweise Zeichen enthält, die in HTML Sonderbedeutung haben, in HTML eingebettet werden soll, müssen diese Sonderzeichen entschärft werden - das geht in HTML, indem sie in Entities gewandelt werden.
Allerdings macht htmlentities() mehr, als notwendig, weil es auch vollkommen ungefährliche Umlaute in Entities wandelt.
Es reicht aus, bei der Ausgabe in HTML htmlspecialchars() aufzurufen.
Wieso kann dieser Code trotzdem meine Seite zerschießen???
var hat doch jetzt den Wert
<script>alert('CSS Vulnerable')</script>
oder etwa nicht?Anschließend an den Alert bekomme ich die Fehlermeldung:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in ...
Du schreibst dein Formularfeld anscheinend in eine Datenbank. Zum Glück hast du in deinem Testcode einfache Anführungszeichen verwendet, die tatsächlich ungefiltert durchgegangen sind, deshalb hast du auch diesen Fehler gefunden.
Für die Einbettung von Strings mit möglicherweise bösen Inhalten in MySQL-Querys gilt dasselbe, wie für die Einbettung in HTML: Die bösen Zeichen müssen entschärft werden. Allerdings müssen hier andere Zeichen entschärft werden, als bei HTML. Deshalb gibts auch eine andere Funktion: mysql_real_escape_string().
- Sven Rautenberg
"Love your nation - respect the others."