Vous pouvez également utiliser eval()
mais JSON.parse()
c'est plus sûr et plus simple, alors pourquoi le feriez-vous?
bon et fonctionne
var yourJsonObject = JSON.parse(json_as_text);
Je ne vois aucune raison pourquoi préféreriez-vous utiliser eval
. Cela ne fait que mettre votre application en danger.
Cela dit - c'est également possible.
mauvais - mais fonctionne aussi
var yourJsonObject = eval(json_as_text);
Pourquoi est-ce eval
une mauvaise idée?
Prenons l'exemple suivant.
Un tiers ou un utilisateur a fourni des données de chaîne JSON.
var json = `
[{
"adjacencies": [
{
"nodeTo": function(){
return "delete server files - you have been hacked!";
}(),
"nodeFrom": "graphnode1",
"data": {
"$color": "#557EAA"
}
}
],
"data": {
"$color": "#EBB056",
"$type": "triangle",
"$dim": 9
},
"id": "graphnode1",
"name": "graphnode1"
},{
"adjacencies": [],
"data": {
"$color": "#EBB056",
"$type": "triangle",
"$dim": 9
},
"id": "graphnode2",
"name": "graphnode2"
}]
`;
Votre script côté serveur traite ces données.
En utilisant JSON.parse
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = JSON.parse(json)[0].adjacencies[0].nodeTo;
}
jettera:
Uncaught SyntaxError: Unexpected token u in JSON at position X.
La fonction ne sera pas exécutée.
Tu es en sécurité.
En utilisant eval()
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = eval(json)[0].adjacencies[0].nodeTo;
}
exécutera la fonction et renverra le texte.
Si je remplace cette fonction inoffensive par une qui supprime les fichiers de votre dossier de site Web, vous avez été piraté. Aucune erreur / avertissement ne sera généré dans cet exemple.
Vous n'êtes PAS en sécurité.
J'ai pu manipuler une chaîne de texte JSON pour qu'elle agisse comme une fonction qui s'exécutera sur le serveur.
eval(JSON)[0].adjacencies[0].nodeTo
s'attend à traiter une chaîne JSON mais, en réalité, nous venons d'exécuter une fonction sur notre serveur.
Cela pourrait également être évité si nous vérifions côté serveur toutes les données fournies par l'utilisateur avant de les transmettre à une eval()
fonction, mais pourquoi ne pas simplement utiliser l'outil intégré pour analyser JSON et éviter tous ces problèmes et dangers?