Sven Rautenberg: utf8_encode, aber \n, \r\n, \r sollen erhalten bleiben

Beitrag lesen

Moin!

Om nah hoo pez nyeetz, Matti Mäkitalo!

Ich würde dir empfehlen, beim Übergang zu JavaScript Daten generell als JSON auszuliefern

getan, DB umgestellt (findet man das eigentlich auch irgendwo in der GUI von phpmyadmin?)

Der String lautet lorem ipsum, die Ausgabe (logischerweise) "lorem ipsum". Gibt es einen eleganteren Weg als substr(json_encode($bar),1,-1), die Anführungszeichen zu eleminieren?

Sorry, wenn ich da jetzt doch noch mal unwirsch dazwischenhaue:

Warum gibst du uns denn nicht mal ein KOMPLETTES CODEBEISPIEL?

Immer wenn du so ein Fragment wie oben postest, dann schreit es mich an: "Kontext mißachtet!"

json_encode() tut genau eines: Es wandelt eine PHP-Variable beliebigen Inhalts in eine korrekte Javascript-Notation um, die sinngemäß dieselbe Variable in Javascript erzeugen könnte.

DAS IST ABER NICHT DIE GANZE GESCHICHTE!

Denn Javascript steht ja meist nicht allein. Würde man tatsächlich eine eigene Javascript-Datei, die durch einen separaten Request dynamisch entsteht, mit PHP-Variablen befüllen wollen, wäre json_encode() genau richtig. Dann allerdings SIND DIE ANFÜHRUNGSZEICHEN ZWINGEND NOTWENDIG! Sie dürfen nicht entfernt werden, sie gehören zum encodeten Wert dazu. Vielmehr darf man eben keine statischen Anführungszeichen im Javascript-Code verwenden, denn wenn welche notwendig sind, kommen die von json_encode().

Jetzt wird die ganze Sache allerdings komplizierter dadurch, dass dynamisch generiertes Javascript in der Regel irgendwo in einem HTML-Template steht, somit der Javascript-Code nicht nackt, sondern eingebettet zwischen <script></script> platziert wird, und dass der Browser als allererstes die Template-Ausgabe erstmal durch seinen HTML-Parser jagt und decodiert - und erst DANACH kommt der Javascript-Parser für die gefundenen Script-Inseln der Seite.

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, unabhängig davon, ob das laut Javascript-Syntax dort erlaubt ist, oder nicht. Denn dass der Javascript-Code kaputt ist, interessiert den HTML-Parser nicht im geringsten.

Insofern also bittebittebitte: Komplette Codebeispiele, nichts reduzieren, insbesondere nicht vorwegnehmen, dass "der Kontextwechsel garantiert beachtet wurde" - denn genau das ist in der gesamten Diskussion dieses Threads zweifelhaft, aber eben nur dann beweisbar, wenn man wirklich komplett von vorn bis hinten und zurück weiß, was passieren soll.

Wenn ein Kontextwechsel nicht korrekt beachtet wird, entsteht nicht nur eine kaputte Textarea, sondern eine Angriffslücke für XSS. Und sowas ist böse.

- Sven Rautenberg