Potresti anche usare eval()
ma JSON.parse()
è un modo più sicuro e semplice, quindi perché dovresti?
bene e funziona
var yourJsonObject = JSON.parse(json_as_text);
Non vedo alcun motivo per cui preferiresti usare eval
. Mette a rischio la tua applicazione.
Detto questo, anche questo è possibile.
male - ma funziona anche
var yourJsonObject = eval(json_as_text);
Perché è eval
una cattiva idea?
Considera il seguente esempio.
Alcuni dati di stringa JSON forniti da terze parti o utenti.
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"
}]
`;
Lo script sul lato server elabora tali dati.
Utilizzando JSON.parse
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = JSON.parse(json)[0].adjacencies[0].nodeTo;
}
getterà:
Uncaught SyntaxError: Unexpected token u in JSON at position X.
La funzione non verrà eseguita.
Sei al sicuro.
Utilizzando eval()
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = eval(json)[0].adjacencies[0].nodeTo;
}
eseguirà la funzione e restituirà il testo.
Se sostituisco quella funzione innocua con una che rimuove i file dalla cartella del tuo sito Web, sei stato violato. In questo esempio non verranno generati errori / avvisi.
NON sei al sicuro.
Sono stato in grado di manipolare una stringa di testo JSON in modo che agisca come una funzione che verrà eseguita sul server.
eval(JSON)[0].adjacencies[0].nodeTo
si aspetta di elaborare una stringa JSON ma, in realtà, abbiamo appena eseguito una funzione sul nostro server.
Ciò potrebbe anche essere evitato se sul lato server controlliamo tutti i dati forniti dall'utente prima di passarli a una eval()
funzione, ma perché non usare semplicemente lo strumento integrato per analizzare JSON ed evitare tutti questi problemi e pericoli?