Tach!
// Bereite das JSON darauf vor, in ein script-Element geschrieben zu werden:
$html_safe_json = str_replace('</', '<\/', $json_string);
// Das JSON kann nun </script> enthalten, ohne dass Cross-Site-Scripting möglich ist
Ich hab grad nachgedacht, ob hier nicht auch htmlspecialchars() verwendet werden könnte. Aber die Antwort war dann noch nein. Und man muss erwähnen, dass $html_safe_json als Name nicht ganz stimmt. Er ist etwas zu allgemein. Javascript kann an zwei Arten von Orten im HTML stehen. Die eine Art ist als Attribut in einem HTML-Element, die andere innerhalb eines Script-Elements (<script>...</script>). Und bei denen sind die Regeln etwas anders. Im script-Block wird alles wörtlich an Javascript durchgereicht. Ein < zum Beispiel würde als ebendiese vier Zeichen angesehen werden. Das erste Auftreten von </ allerdings lässt den Parser wieder in den HTML-Modus zurückschalten. Deswegen muss da nur ein eventuelles </ berücksichtigt und entschärft werden. Anders im Attribut, hier wird der Inhalt zuerst nach den HTML-Regeln aufgelöst und dann erst an Javascript weitergereicht. Hier muss htmlspecialchars() verwendet (gegebenenfalls mit ENT_QUOTES) und nicht nur </ beachtet werden.
Disclaimer 2: Ich programmiere schon seit 10 Jahren kein PHP mehr.
Ich habe nichts zu beanstanden.
dedlfix.