Możesz również użyć, eval()
ale JSON.parse()
jest to bezpieczniejszy i łatwiejszy sposób, więc dlaczego miałbyś?
dobrze i działa
var yourJsonObject = JSON.parse(json_as_text);
Nie widzę żadnego powodu, dla którego wolałbyś skorzystać eval
. To tylko zagraża twojej aplikacji.
To powiedziawszy - jest to również możliwe.
źle - ale też działa
var yourJsonObject = eval(json_as_text);
Dlaczego jest eval
to zły pomysł?
Rozważ następujący przykład.
Niektóre strony trzecie lub użytkownik podali dane ciągu 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"
}]
`;
Skrypt po stronie serwera przetwarza te dane.
Używanie JSON.parse
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = JSON.parse(json)[0].adjacencies[0].nodeTo;
}
rzuci:
Uncaught SyntaxError: Unexpected token u in JSON at position X.
Funkcja nie zostanie wykonana.
Jesteś bezpieczny.
Używanie eval()
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = eval(json)[0].adjacencies[0].nodeTo;
}
wykona funkcję i zwróci tekst.
Jeśli zamienię tę nieszkodliwą funkcję na tę, która usuwa pliki z folderu witryny, zostałeś zhakowany. W tym przykładzie nie zostaną zgłoszone żadne błędy / ostrzeżenia.
NIE jesteś bezpieczny.
Byłem w stanie manipulować ciągiem tekstowym JSON, więc działa on jako funkcja, która zostanie wykonana na serwerze.
eval(JSON)[0].adjacencies[0].nodeTo
oczekuje przetworzenia ciągu JSON, ale w rzeczywistości właśnie wykonaliśmy funkcję na naszym serwerze.
Można temu zapobiec, jeśli po stronie serwera sprawdzimy wszystkie dane dostarczone przez użytkownika przed przekazaniem ich do eval()
funkcji, ale dlaczego nie skorzystać z wbudowanego narzędzia do analizy JSON i uniknąć wszystkich problemów i niebezpieczeństw?