El hack //<![CDATA[
se usa en páginas XHTML que tienen que analizar tanto HTML como XML.
En las reglas de análisis de HTML, <script>
y <style>
son "elementos CDATA" especiales, cuyos contenidos hasta la siguiente secuencia </
(HTML4) o </script
secuencia (HTML5) son datos sin procesar, por lo que if (x<y)
puede escribirse sin ningún tipo de codificación; esto ensuciaría los analizadores XML.
En las reglas de análisis XML no hay elementos especiales, por lo que la misma declaración debería escribirse como if (x<y)
; esto ensuciaría los analizadores HTML.
Para permitir que <
se escriba sin escapar y significa lo mismo para los analizadores XML y HTML, puede envolver el script en una Sección CDATA de XML, luego proteger los analizadores HTML de esa construcción extraña escondiéndolo en un Comentario de JavaScript.
Si está utilizando este constructo para permitirle incluir estos caracteres en un literal de cadena sin escapar, no es suficiente, ya que todavía tiene que escapar de la secuencia </
(para HTML) y ]]>
(para XML). Una forma de escapar de esas secuencias en un literal de cadena JS es codificar siempre los caracteres <>&
a \x3C
, \x3E
y \x26
respectivamente ... en cuyo caso ya no necesitaría la sección CDATA.
Ejecuto los objetos a través de un modificador de JSON estándar que sigue todas las reglas, luego sustituyo </script
con <\/script
, no distingue entre mayúsculas y minúsculas. ¿Es esto suficiente?
No necesariamente.
-
sintaxis HTML. <\/script
está bien para HTML pero no para XHTML, como se indicó anteriormente.
-
Sintaxis de JavaScript. Hay, debido a un desafortunado descuido en el diseño de JSON, algunos caracteres de control Unicode que son válidos en JSON pero no son válidos en JavaScript.
Más notablemente los caracteres U + 2028 y U + 2029, Separador de líneas y párrafos, que actúan como nuevas líneas. Inyectar una nueva línea en el medio de un literal de cadena probablemente causará un error de sintaxis (literal de cadena sin terminar).
Hay más caracteres de control que se supone que no son válidos en los literales de cadena JS, pero que en realidad no interrumpen los navegadores en la práctica.
Si su codificador JSON codifica habitualmente todos los caracteres que no son ASCII, esto no será un problema.
Alternativa a la correcta codificación de JS incrustada: evite los scripts en línea por completo, coloque sus datos en la página HTML (donde se aplican las reglas de escape de HTML normales) y recupérela de los scripts vinculados utilizando métodos DOM.