html - languages - Incrustar objetos JSON en etiquetas de script
extends django (4)
Haría algo como esto:
<script type=''text/javascript''>JSON={"foo": "</" + "script>"};</script>
EDITAR: Para futuras referencias, estoy usando una definición de tipo de contenido que no es xhtml <!html>
Estoy creando un sitio web con Django, y estoy tratando de incrustar datos json arbitrarios en mis páginas para que sean utilizados por el código javascript del lado del cliente.
Digamos que mi objeto json es {"foo": "</script>"}
. Si inserto esto directamente,
<script type=''text/javascript''>JSON={"foo": "</script>"};</script>
El primero cierra el objeto json. (Además, hará que el sitio sea vulnerable a XSS, ya que este objeto json se generará dinámicamente).
Si uso la función de escape HTML de django, la salida resultante es:
<script type=''text/javascript''>JSON={"foo": "</script>"};</script>
y el navegador no puede interpretar la etiqueta <script>
.
La pregunta que tengo aquí es,
- ¿Qué personajes se supone que debo escapar / no escapar en esta situación?
- ¿Hay una forma automatizada de realizar esto en Python / django?
Intenté la barra invertida escapando de la barra diagonal y eso parece funcionar:
<script type=''text/javascript''>JSON={"foo": "<//script>"};</script>
¿Has probado eso?
En una nota al margen, me sorprende que la etiqueta </script>
incrustada en una cadena rompa el javascript. No podía creerlo al principio, pero probado en Chrome y Firefox.
Para este caso en Python, he abierto un bug en el rastreador de errores. Sin embargo, las reglas son realmente complicadas, ya que <!--
y <script>
reproducen de manera bastante malvada incluso en las reglas de análisis html5 adoptadas. Por cierto, ">" no es un escape JSON válido, así que sería mejor reemplazarlo con "/ u003E", por lo tanto, el escape absolutamente seguro debería ser escapar de u003C y / u003E Y un par de otros personajes malvados mencionados en el error de Python. ..
Si está utilizando XHTML, podría usar referencias de entidad ( <
>
&
) para escapar de cualquier cadena que desee dentro de <script>
. No querría usar una sección <![CDATA[...]]>
porque la secuencia " ]]>
" no se puede expresar dentro de una sección de CDATA, y tendría que cambiar la secuencia de comandos para expresar ]]>
.
Pero probablemente no estés usando XHTML. Si está utilizando HTML normal, la etiqueta <script>
actúa de manera similar a una sección CDATA en XML, excepto que tiene aún más escollos. Termina con </script>
. También hay reglas arcanas que permiten que <!-- document.write("<script>...</script>") -->
(los comentarios y la etiqueta de apertura <script>
deben estar presentes para </script>
a pasar a través de). El compromiso que los editores de HTML5 adoptaron para los futuros navegadores se describe en la tokenización HTML 5 y Escapes de CDATA.
Creo que lo mejor es que debe evitar que </script>
ocurra en su JSON, y para estar seguro, también debe evitar <script>
, <!--
, y -->
para evitar comentarios fuera de control o etiquetas de script. Creo que es más fácil reemplazar <
con /u003c
y -->
con --/>