Hi,
<html>
<head>
<script type="text/javascript">
alert("wont be alerted");
alert("</script>");
alert("will be written to document");
</script>
</head>
<body>
</body>
</html>
>
> ausgegeben wird:
>
> `"); alert("will be written to document"); `{:.language-html}
>
> Ich kann nicht verstehen, warum das schließende script-tag, obwohl es im String steht, alles kaputt macht.
Weil der HTML-Parser sich nicht dafür interessiert, ob sich die Zeichenfolge </script> in einem Javascript-String befindet. Er sucht nach dem öffnenden script-Tag einfach das erste schließende script-Tag (also die Zeichenfolge </script>
(genaugenommen müßte er sogar den Script-Block beim ersten </ beenden)
Der Javascript-Parser bekommt also nur
alert("wont be alerted");
alert("
vorgeworfen. Und das kann er nicht erfolgreich parsen, also wird das Script dann auch nicht ausgeführt, da es ja syntaktisch falsch ist.
> Nicht mal das erste alert wird ausgeführt.
Natürlich nicht.
> Hat jemand dafür eine Erklärung?
s.o.
Sorge dafür, daß die Zeichenfolge </ nicht im Javascript auftaucht, z.B. durch escapen des / per \, also <\/ oder durch Aufteilen des Strings "<" + "/script".
> Und weiter: Gibt es workarounds oder Maßnahmen, um user-inputs entsprechend zu filter, damit sie, falls sie nach Eingabe irgendwo in die Seite geschrieben werden nicht alles kaputt machen wenn ein "</script>" eingegeben wird !?
Ja, behandle sie kontextgerecht, zwei Möglichkeiten für Script hab ich schon gegeben, für HTML allgemein: < durch < ersetzen, wenn keine Tags gewünscht werden.
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)
[O o ostern ...](http://ostereier.andreas-waechter.de/)
Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.