Matthias Apsel: utf8_encode, aber \n, \r\n, \r sollen erhalten bleiben

Beitrag lesen

Om nah hoo pez nyeetz, dedlfix!

Die Ausgabe von json_encode() muss also, genau wie der gesamte Javascript-Code an sich, auch noch für den HTML-Kontext escaped werden. Und genau da wird's leicht haarig, denn die Browser akzeptieren neben dem offensichtlichen leider auch noch allen möglichen Müll und sind dementsprechend angreifbar, wenn man nicht aufpasst. Beispielsweise beendet jegliches Auftreten der Zeichenkette "</script>" den aktuellen Javascript-Bereich,

Laut HTML-4-Spec reicht dazu bereits </. Ob HTML5 da was anderes vorgibt, weiß ich nicht. Weiterhin gilt, dass der Inhalt des Script-Bereichs nicht weiter gemäß HTML dekodiert wird. Im Script-Bereich muss also außer dem </ nur der Javascript-Kontext beachtet werden. Anders ergeht es Code in einem HTML-Attribut (wie Eventhandlern), der wird nach HTML-Regeln behandelt.

json_encode liefert das Escaping gleich mit.

var_dump(json_encode(</script>)); liefert </script>

Matthias

--
1/z ist kein Blatt Papier.