Je pense à intégrer JSON arbitraire dans le DOM comme ceci:
<script type="application/json" id="stuff">
{
"unicorns": "awesome",
"abc": [1, 2, 3]
}
</script>
Ceci est similaire à la façon dont on peut stocker un modèle HTML arbitraire dans le DOM pour une utilisation ultérieure avec un moteur de modèle JavaScript. Dans ce cas, nous pourrions plus tard récupérer le JSON et l'analyser avec:
var stuff = JSON.parse(document.getElementById('stuff').innerHTML);
Cela fonctionne , mais est-ce le meilleur moyen? Cela enfreint-il une des meilleures pratiques ou des normes?
Remarque: je ne cherche pas d'alternatives au stockage de JSON dans le DOM, j'ai déjà décidé que c'était la meilleure solution pour le problème particulier que je rencontre. Je cherche juste la meilleure façon de le faire.
javascript
json
dom
embedding
decoupling
Ben Lee
la source
la source
var
en javascript?</script><script>alert()</script><script>
intérieur de votre objet JSON, vous aurez des surprises. Ce n'est pas sûr sauf si vous nettoyez d'abord les données.Réponses:
Je pense que votre méthode originale est la meilleure. La spécification HTML5 aborde même cette utilisation:
Lisez ici: http://dev.w3.org/html5/spec/Overview.html#the-script-element
Vous avez fait exactement cela. Ce qui est de ne pas aimer? Aucun codage de caractères nécessaire avec les données d'attribut. Vous pouvez le formater si vous le souhaitez. C'est expressif et l'utilisation prévue est claire. Cela ne ressemble pas à un hack (par exemple, comme le fait d'utiliser CSS pour masquer votre élément "porteur"). C'est parfaitement valable.
la source
script
balises.En règle générale, j'essaierais d'utiliser les attributs de données HTML5 à la place. Rien ne vous empêche de mettre en JSON valide. par exemple:
Si vous utilisez jQuery, le récupérer est aussi simple que:
la source
JSON.parse
ne fonctionnera pas (au moins le Google Chrome JSON.parse natif ne le fera pas). La spécification JSON nécessite des guillemets doubles. Mais c'est assez facile à résoudre en utilisant des entités comme...<unicorns>:...
."I am valid JSON"
et en utilisant des guillemets doubles pour la balise, ou des guillemets simples avec des guillemets simples dans la chaîne, par exemple,data-unicorns='"My JSON's string"'
car les guillemets simples ne sont pas échappés avec un codage en JSON.Cette méthode d'incorporation de json dans une balise de script présente un problème de sécurité potentiel. En supposant que les données json proviennent de l'entrée utilisateur, il est possible de créer un membre de données qui sortira en fait de la balise de script et permettra l'injection directe dans le dom. Vois ici:
http://jsfiddle.net/YmhZv/1/
Voici l'injection
Il n'y a tout simplement aucun moyen d'éviter l'échappement / l'encodage.
la source
Voir la règle n ° 3.1 dans la feuille de triche de prévention XSS de l'OWASP.
Supposons que vous souhaitiez inclure ce JSON dans HTML:
Créez un caché
<div>
en HTML. Ensuite, échappez à votre JSON en encodant des entités non sécurisées (par exemple, &, <,>, ", ', et, /) et placez-le dans l'élément.Vous pouvez maintenant y accéder en lisant le
textContent
de l'élément en utilisant JavaScript et en l'analysant:la source
{name: 'Dwayne "The Rock" Johnson'}
. Mais il est probablement toujours préférable d'utiliser cette approche car votre framework / bibliothèque de modèles inclut probablement déjà un moyen sûr de faire l'encodage HTML. Une alternative serait d'utiliser base64 qui est à la fois sûr HTML et sûr à insérer dans une chaîne JS. Il est facile d'encoder / décoder en JS en utilisant btoa () / atob () et c'est probablement facile pour vous de le faire côté serveur.<data>
élément sémantiquement correct et à inclure les données JSON dans l'value
attribut. Ensuite, vous n'avez besoin d'échapper les guillemets avec"
si vous utilisez des guillemets doubles pour entourer les données, ou'
si vous utilisez des guillemets simples (ce qui est probablement mieux).Je suggérerais de mettre JSON dans un script en ligne avec un rappel de fonction (sorte de JSONP ):
Si le script en cours d'exécution est chargé après le document, vous pouvez le stocker quelque part, éventuellement avec un argument d'identifiant supplémentaire:
someCallback("stuff", { ... });
la source
Ma recommandation serait de conserver les données JSON dans des
.json
fichiers externes , puis de récupérer ces fichiers via Ajax. Vous ne mettez pas de code CSS et JavaScript sur la page Web (en ligne), alors pourquoi le feriez-vous avec JSON?la source
HTML5 comprend un
<data>
élément permettant de conserver les données lisibles par machine. Comme alternative, peut-être plus sûre,<script type="application/json">
vous pouvez inclure vos données JSON dans l'value
attribut de cet élément.Dans ce cas, vous devez remplacer tous les guillemets simples par
'
ou par"
si vous choisissez de mettre la valeur entre guillemets doubles. Sinon, votre risque d' attaques XSS comme d'autres réponses l'ont suggéré.la source