Einbetten von JSON-Objekten in script-tags
EDIT: Für die Zukunft, ich bin mit nicht xhtml-content-Typ-definition <!html>
Ich bin erstellen einer Webseite mit Django, und ich bin versucht zu einbetten beliebiger json-Daten in meine Seiten für die Verwendung durch client-side javascript code.
Lassen Sie uns sagen, dass meine json-Objekt {"foo": "</script>"}
. Wenn ich den embed direkt,
<script type='text/javascript'>JSON={"foo": "</script>"};</script>
Das erste schließt das json-Objekt. (auch, es wird die Website anfällig für XSS, da das json-Objekt wird dynamisch generiert).
Wenn ich mit django HTML-escape-Funktion, die resultierende Ausgabe ist:
<script type='text/javascript'>JSON={"foo": "</script>"};</script>
und der browser nicht interpretieren kann, kann der <script>
tag.
Die Frage, die ich hier habe, ist,
- Die Charaktere bin ich wohl zu Flucht oder nicht Flucht in dieser situation?
- Ist es, automatisierte Methode zum durchführen dieser in Python /django?
- Sie können entity-Referenzen (<, >) in <script> nur, wenn Sie mit XHTML. Wenn Sie mit den regulären HTML -, Sie können keine HTML-escape-Skript. Stattdessen, Folgen Sie slebetman Beratung und nur sicherstellen, dass / ist entkommen.
- so, die Flucht nur Schrägstriche durch ausführen von string-Ersatz für / mit \/ gut genug ist?
- ja, das sollte der Fall sein. Für mehr Informationen Browser Parsen der script-tag finden Sie unter HTML-5 tokenization:
- Sorry, ich war falsch. Lassen Sie mich klarstellen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit XHTML, würden Sie in der Lage sein zu verwenden entity-Referenzen (
<
,>
,&
) auf der Flucht eine beliebige Zeichenfolge, die Sie wollen innerhalb<script>
. Sie würde nicht verwenden möchten<![CDATA[...]]>
Abschnitt, weil die Sequenz "]]>
" kann nicht ausgedrückt werden innerhalb einer CDATA-Abschnitt, und Sie würde das Skript ändern, um express]]>
.Aber du bist wahrscheinlich nicht mit XHTML. Wenn Sie mit regulären HTML, die
<script>
tag wirkt ein wenig wie ein CDATA-Abschnitt im XML -, außer dass es noch mehr Fallstricke. Es endet mit</script>
. Es gibt auch Arkane Regeln erlauben<!-- document.write("<script>...</script>") -->
(die Kommentare und<script>
öffnende tag muss beides vorhanden sein, für</script>
Durchlaufen werden). Der Kompromiss, der HTML5-Editoren angenommen für zukünftige Browser ist beschrieben in HTML 5 tokenization und CDATA EntweichtIch denke, das mitnehmen ist, dass Sie verhindern müssen, dass
</script>
aus, die in Ihrer JSON, und um sicher zu sein, sollten Sie auch vermeiden<script>
,<!--
, und-->
um zu verhindern, dass runaway Kommentare oder script-tags. Ich denke, es ist am einfachsten, einfach zu ersetzen<
mit\u003c
und-->
mit--\>
Habe ich versucht backslash Flucht der Schrägstrich und das scheint zu funktionieren:
hast du das ausprobiert?
On a side note, ich bin überrascht, dass die eingebettete
</script>
- tag in einem string bricht das javascript. Konnte es nicht glauben zuerst, aber getestet in Chrome und Firefox."</scr" + "ipt>"
Ich würde so etwas tun:
Für diesen Fall in python, die ich geöffnet haben bug im bug-tracker. Aber die Regeln sind in der Tat kompliziert, als
<!--
und<script>
spielen zusammen in ganz schlimmen Wege, auch in der verabschiedeten html5-parsing-Regeln. BTW, ">" ist kein gültiges JSON entkommen, so wäre es besser ersetzt werden durch "\u003E", so die absolut sicher entkommen sein sollte, zu entkommen \u003C und \u003E UND ein paar andere böse Charaktere erwähnt in der python-bug...