Hallo,
Und http://framework.zend.com/manual/2.1/en/modules/zend.escaper.escaping-javascript.html
Da steht aber ziemlicher Quatsch.
Das erste Beispiel ist kein XSS, zumindest nicht in neueren Browsern. Denn Zeichenreferenzen werden in script-Elementen nicht vom HTML5-Parser umgesetzt, sondern wörtlich an den JS-Interpreter weitergegeben. War auch so in HTML 4 definiert.
Die Sicherheitslücke wird wahrscheinlich erst dadurch geschaffen, dass das Dokument als XHTML ausgeliefert wird:
<?php header('Content-Type: application/xhtml+xml; charset=UTF-8'); ?>
Das sollte man tunlichst unterlassen! Schön bei text/html bleiben und den HTML5-Parser nutzen.
Es ist aber richtig, dass json_encode NICHT ausreicht für das Einbetten von Daten in ein script-Element. htmlspecialchars kann nämlich nicht angewandt werden, weil Zeichenreferenzen wie gesagt ignoriert werden.
In der JSON-Serialisierung kann </script><script>alert('XSS')</script> vorkommen, was das script-Element beendet und Code einschleust. Man müsste hier in JSON-strings </script> durch </script> ersetzen. Das ist aber sehr aufwändig und fehlerträchtig.
Soweit ich weiß (ich bin KEIN Sicherheitsexperte), bettet man JSON daher besser in Elemente oder Attribute ein, nicht in <script>…</script>. Dort kann nämlich normales HTML-Escaping angewandt werden.
Das zweite, vermeintlich sichere Beispiel auf der Zend-Seite verstehe ich nicht. Da wird syntaktisch fehlerhafter JavaScript-Code generiert. Was ist überhaupt das Ziel? Ein String an JavaScript zu übergeben geht viel einfacher. Da würde ich eher einen HTML-Sanitizer wie HTML Purifier verwenden.
Mathias