Falls sich jemand fragt, ob es sicher ist, mittels PHP und nur addslashes() Daten in eine JavaScript-Variable im HTML-Code zu schreiben: Nein, ist es nicht!
Siehe: https://github.com/killerbees1…r/security/xss-addslashes
Das stark vereinfachte Beispiel nimmt Daten von einem GET-Formular entgegen und begrüßt den Benutzer auf der Folgeseite mittels alert(). Was soll da schon groß passieren?
Aus dem String auszubrechen ist Dank </script> leicht möglich. Schwieriger wird es dann nur, ein externes Script ohne die Zeichen '" nachzuladen. Aber auch das geht, indem man sich die benötigten Strings einfach aus der URL oder dem Anker holt. Für substr() braucht man nämlich keine Anführungszeichen. Edit: Blödsinn, ein HTML-Attribut muss ja keine Quotes haben. Ein Script einzubinden geht also noch einfacher.
Fertig ist der Exploit, zu dem man das Opfer nur noch locken muss…
(Sobald evil.js auf einem externen Server liegt, meldet sich übrigens NoScript. Nutzer dieses Addons sollten theoretisch nicht betroffen sein.)
htmlspecialchars() hätte das verhindert, würde aber den String bei bestimmten Sonderzeichen verschandeln. Und wirklich notwendig ist es ja nicht, da es sich um kein HTML-Attribut handelt. [Dachte sich wahrscheinlich der Programmierer.]
Die wirkliche Lösung führt über json_encode(). Sollte das Ergebnis innerhalb eines HTML-Attributs verwendet werden, muss es natürlich trotzdem noch einmal durch htmlspecialchars() gejagt werden!