template languages inclusiontag get_template dirs dateformat html django json

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={&quot;foo&quot;: &quot;&lt;/script&gt;&quot;};</script>

y el navegador no puede interpretar la etiqueta <script> .

La pregunta que tengo aquí es,

  1. ¿Qué personajes se supone que debo escapar / no escapar en esta situación?
  2. ¿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 ( &lt; &gt; &amp; ) 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 --/>