<?php
[code lang=php]$obj = new stdClass();
$obj->foo = 'user-provided string, arbitrary data, e.g. $_GET["something"]';
$json = json_encode($obj);
$escaper = new Zend\Escaper\Escaper('utf-8');
$output = $escaper->escapeJs($json);
> <script>
> `var obj = <?php echo $output ?>;`{:.language-javascript}
> </script>[/code]
>
> (Ungetestet, ich weiß nicht, ob das so herum überhaupt geht.)
Getestet, ist anscheinend »sicher«, aber erzeugt ebenfalls einen Syntaxfehler. Ausgabe:
`var obj = \x7B\x22foo\x22\x3A\x22user\x2Dprovided\x20string,\x20arbitrary\x20data,\x20e.g.\x20\x24_GET\x5B\x5C\x22something\x5C\x22\x5D\x22\x7D;`{:.language-javascript}
Das ist natürlich kein gültiges JavaScript. Wie denken sich die Zend-Leute das? Kann escapeJs für solche Fälle verwendet werden? Es kann nicht sein, dass ich die Werte \*vor\* der JSON-Serialisierung mit escapeJs behandle. Dann kommen gültige Wert verstümmelt im JavaScript an.
Ich wüsste hier keine Lösung. Daher wies ich darauf hin, JSON stattdessen [in ein Attribut oder Element](https://forum.selfhtml.org/?t=217757&m=1496873) auszugeben. Das scheint wohl Best Practice zu sein, siehe das [OWASP XSS Prevention Cheat Sheet](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.233.1_-_HTML_escape_JSON_values_in_an_HTML_context_and_read_the_data_with_JSON.parse).
Mathias