Ich muss ein JSON-Objekt in ein Attribut eines HTML-Elements einfügen.
Der HTML-Code muss nicht validiert werden.Antwort von Quentin: Speichern Sie den JSON in einem
data-*
Attribut , das gültiges HTML5 ist.Das JSON-Objekt kann eine beliebige Größe haben - dh riesig
Antwort von Maiku Mori: Das Limit für ein HTML-Attribut beträgt möglicherweise 65536 Zeichen .
Was ist, wenn der JSON Sonderzeichen enthält? z.B
{foo: '<"bar/>'}
Antwort von Quentin: Codieren Sie die JSON-Zeichenfolge, bevor Sie sie gemäß den üblichen Konventionen in das Attribut einfügen. Verwenden Sie für PHP die Funktion .
htmlentities()
EDIT - Beispiellösung mit PHP und jQuery
Schreiben des JSON in das HTML-Attribut:
<?php
$data = array(
'1' => 'test',
'foo' => '<"bar/>'
);
$json = json_encode($data);
?>
<a href="#" data-json="<?php echo htmlentities($json, ENT_QUOTES, 'UTF-8'); ?>">CLICK ME</a>
Abrufen des JSON mit jQuery:
$('a').click(function() {
// Read the contents of the attribute (returns a string)
var data = $(this).data('json');
// Parse the string back into a proper JSON object
var json = $.parseJSON($(this).data('json'));
// Object now available
console.log(json.foo);
});
javascript
php
html
json
BadHorsie
quelle
quelle
data-json
Sie verwenden sollten$(this).data('json')
, hat die jQuery Sie auf diesen Teil behandelt.Antworten:
Warum nicht? Die Validierung ist eine wirklich einfache Qualitätssicherung, die viele Fehler auffängt. Verwenden Sie ein HTML 5-
data-*
Attribut.Ich habe keine Dokumentation zu Browserbeschränkungen für Attributgrößen gesehen.
Wenn Sie auf sie stoßen, speichern Sie die Daten in einem
<script>
. Definieren Sie ein Objekt und ordnen Sie die Elementeid
den Eigenschaftsnamen in diesem Objekt zu.Befolgen Sie einfach die normalen Regeln für das Einfügen nicht vertrauenswürdiger Daten in Attributwerte. Verwenden Sie
&
und"
(wenn Sie den Attributwert in doppelte Anführungszeichen setzen) oder'
(wenn Sie den Attributwert in einfache Anführungszeichen setzen).Beachten Sie jedoch, dass dies kein JSON ist (was erfordert, dass Eigenschaftsnamen Zeichenfolgen sind und Zeichenfolgen nur durch doppelte Anführungszeichen getrennt werden).
quelle
htmlentities($json)
bevor ich es in das HTML-Attribut einfüge? Und wie dekodiere ich das, wenn ich es in jQuery lesen möchte? Und wie schreibe ich es dann mit jQuery genauso zurück wie mit PHP?Je nachdem, wo Sie es setzen,
<div>
wie Sie gefragt, müssen Sie sicherstellen , dass die JSON keine HTML - Angebote enthält , die einen Tag, HTML - Kommentar, eingebettet Doctype beginnen konnte, etc. Sie müssen mindestens entkommen<
, und&
in einer Art und Weise , so dass der ursprüngliche Charakter nicht erscheinen in der Escape-Sequenz.<script>
Elementen müssen Sie sicherstellen, dass der JSON kein End-Tag</script>
oder keine Escape-Textgrenze enthält :<!--
oder-->
."
oder'
) überschreiten .In den ersten beiden Fällen (und in alten JSON-Parsern) sollten Sie U + 2028 und U + 2029 codieren, da dies in JavaScript Zeilenumbrüche sind, obwohl sie in in JSON nicht codierten Zeichenfolgen zulässig sind.
Für die Richtigkeit müssen Sie Escape-
\
und JSON-Anführungszeichen verwenden, und es ist nie eine schlechte Idee, NUL immer zu codieren.Wenn der HTML-Code möglicherweise ohne Inhaltscodierung bereitgestellt wird, sollten Sie ihn codieren
+
, um UTF-7-Angriffe zu verhindern .In jedem Fall funktioniert die folgende Escape-Tabelle:
\u0000
\n
oder\u000a
\r
oder\u000d
"
->\u0022
&
->\u0026
'
->\u0027
+
->\u002b
/
->\/
oder\u002f
<
->\u003c
>
->\u003e
\
->\\
oder\u005c
\u2028
\u2029
Der JSON-Zeichenfolgenwert für den Text
Hello, <World>!
mit einer neuen Zeile am Ende wäre also"Hello, \u003cWorld\u003e!\r\n"
.quelle
return (input.replace(/([\s"'
& + \ / \\ <> \ u2028 \ u2029 \ u0000]) / g, (match, p1) => {return\\u${p1.codePointAt(0).toString(16).padStart(4, 0)}
; })); `Eine andere Möglichkeit besteht darin, JSON-Daten in das
<script>
Tag einzufügen, jedoch nicht mittype="text/javascript"
, sondern mittype="text/bootstrap"
odertype="text/json"
Typ, um die Ausführung von Javascript zu vermeiden.Dann können Sie an einer Stelle Ihres Programms auf folgende Weise danach fragen:
Auf der Serverseite können Sie so etwas tun (dieses Beispiel mit PHP und Zweig ):
quelle
<script type="application/json" id="MyData"></script>
funktioniert perfekt. Dann kann ich mit ActiveWAFL / DblEj nachschlagen mit :document.GetData("#MyData")
.<script type="application/json" id="MyData"> "abc</script><script>alert()</script>" </script>
Eine andere Möglichkeit besteht darin, die JSON-Zeichenfolge mit base64 zu codieren und sie mit der
atob()
Funktion zu dekodieren, wenn Sie sie in Ihrem Javascript verwenden müssen.quelle
atob
. Das war mir nie bewusst!Sie können knockoutjs verwenden,
knockout.js
Ausgabe
Vorname: Jayson Nachname: Monterroso
Überprüfen Sie dies: http://learn.knockoutjs.com/
quelle
Hier ist nichts Besonderes. Führen Sie in PHP einen Durchlauf der JSON-Zeichenfolge durch
htmlspecialchars
, um sicherzustellen, dass keine Sonderzeichen als HTML interpretiert werden können. Aus Javascript ist kein Entkommen notwendig; Legen Sie einfach das Attribut fest und los geht's.quelle
Für einfache JSON-Objekte würde der folgende Code funktionieren.
Kodieren:
Dekodieren:
quelle
Was Sie tun können, ist, cdata um Ihre Elemente wie diese zu verwenden
Dabei ist mydata eine rohe JSON-Zeichenfolge. Hoffe das hilft dir und anderen.
quelle
">
in mydata speichern möchte?Ein anderer Gedanke, der verwendet werden könnte, besteht darin, die JSON-Daten als base64-Zeichenfolge im Attribut zu speichern und sie dann zu verwenden
window.atob
oderwindow.btoa
in verwendbaren JSON-Daten wiederherzustellen.quelle