2010-11-14 16 views
19

EDIT: Per riferimento futuro, sto usando non xhtml definizione del tipo di contenuto <!html>Embedding JSON oggetti nel tag script

Sto creando un sito web utilizzando Django, e sto cercando di incorporare i dati JSON arbitrari le mie pagine devono essere utilizzate dal codice javascript lato client.

Diciamo che il mio oggetto JSON è {"foo": "</script>"}. Se lo incorporo direttamente,

<script type='text/javascript'>JSON={"foo": "</script>"};</script> 

Il primo chiude l'oggetto json. (inoltre, renderà il sito vulnerabile a XSS, poiché questo oggetto JSON verrà generato dinamicamente).

Se uso la funzione escape HTML di Django, l'output risultante è:

<script type='text/javascript'>JSON={&quot;foo&quot;: &quot;&lt;/script&gt;&quot;};</script> 

e il browser non può interpretare il tag <script>.

La domanda che ho qui è,

  1. cui i personaggi sono io suppongo di fuggire/non sfugge a questa situazione?
  2. C'è un modo automatico per eseguire questo in Python/django?
+0

È possibile utilizzare i riferimenti di entità (<, >) all'interno di

6

ho provato backslash sfuggire alla barra e che sembra funzionare:

<script type='text/javascript'>JSON={"foo": "<\/script>"};</script> 

hai provato?


Su un lato nota, sono sorpreso che la incorporato </script> tag in una stringa rompe il javascript. Non potevo crederci all'inizio ma testato in Chrome e Firefox.

+1

embedded è un po 'scontato (ho pensato che fosse strano), perché ciò significa che l'analisi js deve essere eseguita lungo l'analisi HTML (il parser html deve essere a conoscenza della semantica del testo javascript), che mi sembra molto complicato. –

+1

Sì, i parser HTML di regola non parlano JavaScript. I contenuti dei tag di script vengono passati all'interprete solo dopo che l'HTML è stato analizzato e HTML non dice nulla sui tag che non sono tag quando sono tra virgolette! –

+1

Sì, è previsto - il solito trucco per evitare che si spezzi il tag in due - '" "' –

0

vorrei fare qualcosa di simile:

<script type='text/javascript'>JSON={"foo": "</" + "script>"};</script> 
0

Per questo caso in python, ho aperto un bug nel bug tracker. Tuttavia, le regole sono davvero complicate, poiché <!-- e <script> giocano insieme in modo abbastanza malvagio anche nelle regole di analisi html5 adottate. BTW, ">" non è un escape JSON valido, quindi sarebbe meglio che fosse sostituito con "\ u003E", quindi l'escape assolutamente sicuro dovrebbe essere quello di escape \ u003C e \ u003E AND un paio di altri personaggi malvagi menzionati nel bug python. ..