Ich denke darüber nach, beliebigen JSON wie folgt in das DOM einzubetten:
<script type="application/json" id="stuff">
{
"unicorns": "awesome",
"abc": [1, 2, 3]
}
</script>
Dies ähnelt der Art und Weise, wie eine beliebige HTML-Vorlage im DOM zur späteren Verwendung mit einer JavaScript-Vorlagen-Engine gespeichert werden kann. In diesem Fall können wir den JSON später abrufen und analysieren mit:
var stuff = JSON.parse(document.getElementById('stuff').innerHTML);
Das funktioniert , aber ist es der beste Weg? Verstößt dies gegen bewährte Verfahren oder Standards?
Hinweis: Ich suche nicht nach Alternativen zum Speichern von JSON im DOM. Ich habe bereits entschieden, dass dies die beste Lösung für das jeweilige Problem ist. Ich suche nur nach dem besten Weg, es zu tun.
javascript
json
dom
embedding
decoupling
Ben Lee
quelle
quelle
var
in Javascript?</script><script>alert()</script><script>
in Ihrem JSON-Objekt haben, erhalten Sie Überraschungen. Dies ist nur dann sicher, wenn Sie die Daten zuerst bereinigen.Antworten:
Ich denke, Ihre ursprüngliche Methode ist die beste. Die HTML5-Spezifikation befasst sich sogar mit dieser Verwendung:
Lesen Sie hier: http://dev.w3.org/html5/spec/Overview.html#the-script-element
Du hast genau das getan. Was ist nicht zu lieben? Keine Zeichenkodierung nach Bedarf mit Attributdaten. Sie können es formatieren, wenn Sie möchten. Es ist ausdrucksstark und der Verwendungszweck ist klar. Es fühlt sich nicht wie ein Hack an (z. B. wie bei der Verwendung von CSS, um Ihr "Träger" -Element zu verbergen). Es ist vollkommen gültig.
quelle
script
Tags stoppen kann / wird .Generell würde ich versuchen, stattdessen HTML5-Datenattribute zu verwenden. Nichts hindert Sie daran, gültiges JSON einzugeben. z.B:
Wenn Sie jQuery verwenden, ist das Abrufen so einfach wie:
quelle
JSON.parse
nicht funktioniert (zumindest die native Google Chrome JSON.parse nicht). Die JSON-Spezifikation erfordert doppelte Anführungszeichen. Aber das ist einfach genug, um es mit Entitäten wie zu beheben...<unicorns>:...
."I am valid JSON"
und doppelte Anführungszeichen für das Tag oder einfache Anführungszeichen mit einfachen Anführungszeichen in der Zeichenfolge, z. B.data-unicorns='"My JSON's string"'
da einfache Anführungszeichen bei der Codierung als JSON nicht maskiert werden.Diese Methode zum Einbetten von json in ein Skript-Tag weist ein potenzielles Sicherheitsproblem auf. Unter der Annahme, dass die JSON-Daten aus Benutzereingaben stammen, ist es möglich, ein Datenelement zu erstellen, das tatsächlich aus dem Skript-Tag ausbricht und eine direkte Injektion in den Dom ermöglicht. Siehe hier:
http://jsfiddle.net/YmhZv/1/
Hier ist die Injektion
An Escape / Codierung führt kein Weg vorbei.
quelle
Siehe Regel Nr. 3.1 im XSS-Präventions-Spickzettel von OWASP.
Angenommen, Sie möchten diesen JSON in HTML aufnehmen:
Erstellen Sie ein
<div>
in HTML versteckt . Als nächstes entkommen Sie Ihrem JSON, indem Sie unsichere Entitäten (z. B. &, <,>, ", 'und, /) codieren und in das Element einfügen.Jetzt können Sie darauf zugreifen, indem Sie
textContent
das Element mit JavaScript lesen und analysieren:quelle
{name: 'Dwayne "The Rock" Johnson'}
. Es ist jedoch wahrscheinlich immer noch am besten, diesen Ansatz zu verwenden, da Ihre Framework- / Vorlagenbibliothek wahrscheinlich bereits eine sichere Methode zur HTML-Codierung enthält. Eine Alternative wäre die Verwendung von base64, das sowohl HTML-sicher als auch sicher in eine JS-Zeichenfolge eingefügt werden kann. Es ist einfach, in JS mit btoa () / atob () zu codieren / decodieren, und es ist wahrscheinlich einfach für Sie, serverseitig zu arbeiten.<data>
Element zu verwenden und die JSON-Daten in dasvalue
Attribut aufzunehmen. Dann müssen Sie die Anführungszeichen nur dann umgehen,"
wenn Sie doppelte Anführungszeichen verwenden, um die Daten einzuschließen, oder'
wenn Sie einfache Anführungszeichen verwenden (was wahrscheinlich besser ist).Ich würde vorschlagen, JSON in ein Inline-Skript mit einem Funktionsrückruf (eine Art JSONP ) einzufügen :
Wenn das ausführende Skript nach dem Dokument geladen wird, können Sie es irgendwo speichern, möglicherweise mit einem zusätzlichen Bezeichnerargument:
someCallback("stuff", { ... });
quelle
Meine Empfehlung wäre, JSON-Daten in externen
.json
Dateien zu behalten und diese Dateien dann über Ajax abzurufen. Sie fügen keinen CSS- und JavaScript-Code auf die Webseite (Inline) ein. Warum sollten Sie dies mit JSON tun?quelle
HTML5 enthält ein
<data>
Element zum Speichern maschinenlesbarer Daten. Als - vielleicht sicherere - Alternative zu<script type="application/json">
Ihnen könnten Sie Ihre JSON-Daten in dasvalue
Attribut dieses Elements aufnehmen.In diesem Fall müssen Sie alle einfachen Anführungszeichen durch
'
oder durch ersetzen,"
wenn Sie den Wert in doppelte Anführungszeichen setzen möchten. Andernfalls hat Ihr Risiko XSS- Angriffe wie andere Antworten vorgeschlagen.quelle