Il //<![CDATA[
hack viene utilizzato nelle pagine XHTML che devono analizzare sia come HTML sia come XML.
Nelle regole di analisi HTML, <script>
e <style>
sono speciali "elementi CDATA", i cui contenuti fino alla successiva sequenza </
(HTML4) o </script
sequenza (HTML5) sono dati non elaborati, quindi if (x<y)
può essere scritto senza alcuna codifica; ciò farebbe scombussolare i parser XML.
Nelle regole di analisi XML non ci sono elementi speciali e quindi la stessa istruzione dovrebbe essere scritta come if (x<y)
; questo rovinerebbe i parser HTML.
Per consentire a <
di essere scritto senza caratteri di escape e indicare la stessa cosa sia per i parser XML che HTML, puoi avvolgere lo script in una sezione CDATA XML, quindi proteggere i parser HTML da quel strano costrutto nascondendolo in un Commento JavaScript.
Se stai usando questo costrutto per permetterti di includere questi caratteri in una stringa letterale senza fuggire, non è abbastanza, perché devi comunque scappare sia la sequenza </
(per HTML) che ]]>
(per XML). Un modo per sfuggire a quelle sequenze in una stringa JS letterale è sempre codificare <>&
caratteri in \x3C
, \x3E
e \x26
rispettivamente ... nel qual caso non sarà più necessaria la Sezione CDATA.
I run the objects through a standard JSON stringifier which follows all the rules, then I replace </script
with <\/script
, not case sensitive. Is this sufficient?
Non necessariamente.
-
Sintassi HTML. <\/script
va bene per HTML ma non XHTML, come sopra.
-
Sintassi JavaScript. Ci sono, a causa di una sfortunata svista nella progettazione di JSON, alcuni caratteri di controllo Unicode validi in JSON ma non validi in JavaScript.
In particolare i caratteri U + 2028 e U + 2029, Separatore di linee e paragrafi, che fungono da newline. L'iniezione di una nuova riga nel mezzo di una stringa letterale causerà molto probabilmente un errore di sintassi (letterale stringa non terminato).
Ci sono più caratteri di controllo che dovrebbero essere non validi nei valori letterali delle stringhe JS, ma che in pratica non interrompono i browser.
Se il codificatore JSON codifica abitualmente tutti i caratteri non ASCII, ciò non costituirà un problema.
Alternativa per ottenere la codifica JS incorporata a destra: evitare completamente gli script inline, inserire i dati nella pagina HTML (dove si applicano le normali regole di escape HTML) e recuperarli da script collegati usando i metodi DOM.