dedlfix: konkrete Codebeispiele

Beitrag lesen

Tach!

echo "f.person.value = '" . str_replace('&','&',htmlspecialchars(substr(json_encode($gkind['name']),1,-1), ENT_NOQUOTES, $double_encode = false)) . "';\n";

echo "f.notiz.value = '" . str_replace('&','&',htmlspecialchars(substr(json_encode($gkind['notiz']),1,-1), ENT_NOQUOTES, $double_encode = false)) . "';\n";


> > Und wo hinein echost du das?  
> In ein script-Element eines HTML-Dokuments  
  
[Im Script-Element gilt der HTML-Kontext nicht.](http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel/erkennen_und_behandeln#Script-_und_Style-Bereiche_im_HTML-Dokument) Ein & wären dort 5 einzelne Zeichen. Das & muss dort also ein & sein, damit es ein & ist. Im Eventhandler stehender Javascript-Code ist allerdings den HTML-Regeln unterworfen.  
  
htmlspecialchars() ist also für den <script>-Bereich nicht sinnvoll, jedoch für Eventhandler notwendig. Für <script> muss man aber die Javascript-Regeln und -Fallstricke beachten und entweder [eine selbst geschriebene Maskierfunktion verwenden](http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel/erkennen_und_behandeln#JavaScript) oder das zusätzlich noch quotierende json\_encode() nehmen. Teilstrings können also mit der Maskierfunktion behandelt eingefügt werden und für komplette Strings inklusive Gänsefüße kann man json\_encode() nehmen.  
  
  <?php echo 'var foo = "foo ' . javascript\_escape($bar) . ' qux"'; ?>  
  
$bar ist oben ein Teilstring und unten ein eigenständiger, wobei das Ergebnis betrachtet werden muss. Die ' sind PHP-String-Begrenzer und " sind die von Javascript.  
  
  <?php echo 'var foo = "foo " + ' . json\_encode($bar) . ' + " qux"'; ?>  
  

> Also in `echo "f.person.value = '"`{:.language-php} einfach das `'`{:.language-php} weglassen  
  
Ja, wenn json\_encode() die letzte ausgeführte Funktion vor dem Einfügen ist.  
  
  

> > > 3. htmlspecialchars  
> > Mit NOQUOTES - was ich erstmal für problematisch halte. Warum dies? -- Relevant ist dafür allerdings der Kontext, in dem die Ausgabe stattfindet, und den enthälst du ja schon wieder vor... :)  
> Die Ausgabe erfolgt im HTML-Formular als Werte von einem Textarea- bzw. Input-Element, ich dachte, das geht aus meinem Posting hervor  
  
Wenn du ein Dokument erzeugst, in dem ein <textarea> und darin Text steht, gehört der ge-htmlspecialchar()t. Erzeugst du aber Javascript-Code, der erst im Browser tätig wird und die Textarea füllt, dann bist du zunächst im Javascript-Kontext (vermutlich im erwähnten <script>-Bereich). Erst zur Laufzeit wechselt der Kontext, wenn du mit Javascript den Text in die Textarea schreibst. Ich bin nicht auf dem Laufenden, was da gerade aktuell ist, aber früher gab es zumindest innerText und innerHTML. innerText interpretiert gar nichts und fügt den Text 1:1 ein, innerHTML parst den String nach HTML-Regeln und erzeugt Elemente.  
  

> Damit die "Laus" & Klaus nicht zu die &quot;Laus&quot; &amp; Klaus wird.  
> > > Das htmlspecialchars ist erst nach diesem Thread dazugekommen. Ist das hier wirklich notwendig? Jedenfalls kann ich als Person auch </script> eingeben, ohne das das Script abgebrochen wird.  
> > Kontext?  
  
Das entfällt, wenn du die obigen Kontextwechsel richtig beachtest. Insgesamt ist es immer etwas knifflig, wenn mehrere Kontexte zusammengeschachtelt werden sollen. Hier hilft mitunter schrittweises Vorgehen. Erstmal eine statische HTML-Seite mit syntaktisch korrektem JS-Code und Platzhaltern drin erstellen, dann statt der Platzhalter die mit PHP erzeugten Werte einfügen. Das Ergebnis muss dann wie die statische Seite aussehen.  
  
  
dedlfix.