Kurzerklärung mit Beispiel:
- Cross-Site-Scripting (XSS) wird mit der PHP-Funktion htmlentities bekämpft.
$eingabe = htmlentities($_POST['eingabe'], ENT_QUOTES);
- Das Problem: XSS-Scripting
- Die Lösung: htmlentities
Inhaltsverzeichnis
Das Problem: Cross-Site-Scripting (XSS)
Eine große Gefahr, wenn Sie Formulare mit Benutzereingaben auf einer Website ermöglichen, besteht im Cross-Site-Scripting (XSS).
Worum geht es? Bei XSS-Attacken versucht der Hacker, fremden Code (oftmals: JavaScript) auf die Website einzuschleusen.
Ohne Schutz vor XSS-Angriffen, benutzt der Angreifen einfach eines Ihrer Eingabefelder und jagt den Code rein, der auch gleich ausgeführt wird.
Der folgende Quelltext zeigt ein einfaches HTML-Eingabeformular, das vollkommen ungeschützt ist:
<html><head></head><body>
<h1>Namen eingeben</h1>
<form action="sicherheit.php" method="post">
<input name="eingabe">
<input type="submit" name="submit">
</form>
<?php
if(isset($_POST["submit"])){
$eingabe = $_POST["eingabe"];
echo $eingabe;
}
?>
</body></html>
Wird in das Eingabefeld (input name="eingabe") anstatt des Namens etwa folgender Code eingegeben:
<script>
window.location="https://falconbyte.net";
</script>
Dann wird dieser Code auf der Seite ausgeführt (hier: leitet auf eine andere URL um - das kann sehr übel ausgehen und ist nur ein Beispiel für die Möglichkeiten eines Angriffs!).
Die Lösung: htmlentities
Die PHP-Funktion htmlentities wandelt alle Sonderzeichen wie < und > in HTML-Codes (Entities) um. Damit kann JavaScript nicht mehr ausgeführt werden. Wenn wir zusätlich auch einfache Anführungszeichen ' in HTML entities umwandeln wollen, tragen wir als zweites Argument der Funktion den Wert ENT_QUOTES ein:
<?php
if(isset($_POST["submit"])){
$eingabe = htmlentities($_POST['eingabe'], ENT_QUOTES);
}
?>
Der ins Eingabefeld getippte JavaScript-Code wird dann folgendermaßen erkannt und als harmloser String behandelt (die Sonderzeichen sind umgewandelt:):
<script> window.location="https://falconbyte.net" </script>
Damit kann einer, der Euch Böses will, in Eure Web-Formulare eingeben, was er will: Es wird als harmloser String gewertet.
Man muss dazu sagen, dass alle modernen Browser heute einen eingebauten Schutz vor XSS-Attacken haben. Google-Chrome etwa erkennt Script-Code in Formularfeldern. Der eingebaute XSS-Auditor blockiert dann die Ausführung ("Chrome hat auf dieser Seite ungewöhnlichen Code erfasst und diese Seite daher blockiert").
Trotzdem: Wenn Sie sich darauf nicht verlassen und die Sicherheit der Website selbst in die Hand nehmen wollen, sollten Sie die PHP-Funktion htmlentities verwenden.