Ви також можете використовувати, eval()
але JSON.parse()
це більш безпечний і простий спосіб, так чому б вам це зробити?
добре і працює
var yourJsonObject = JSON.parse(json_as_text);
Я не бачу жодної причини, чому б ви вважали за краще використовувати eval
. Це лише піддає вашій заяві ризик.
Тим НЕ менше - це є також можливо.
погано - але також працює
var yourJsonObject = eval(json_as_text);
Чому eval
погана ідея?
Розглянемо наступний приклад.
Деякі сторонні або користувачі надали рядкові дані 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"
}]
`;
Ваш скрипт на стороні сервера обробляє ці дані.
Використання JSON.parse
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = JSON.parse(json)[0].adjacencies[0].nodeTo;
}
кине:
Uncaught SyntaxError: Unexpected token u in JSON at position X.
Функція не буде виконана.
Ви в безпеці.
Використання eval()
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = eval(json)[0].adjacencies[0].nodeTo;
}
виконає функцію та поверне текст.
Якщо я заміню цю нешкідливу функцію на ту, яка видаляє файли з папки вашого веб-сайту, вас зламали. У цьому прикладі помилки / застереження не будуть викинуті.
Ви НЕ в безпеці.
Мені вдалося маніпулювати текстовим рядком JSON, щоб він виконував функцію, яка буде виконуватися на сервері.
eval(JSON)[0].adjacencies[0].nodeTo
розраховує обробити рядок JSON, але насправді ми лише виконали функцію на нашому сервері.
Цього також можна запобігти, якщо ми перевіримо всі надані користувачем дані, перш ніж передати їх у eval()
функцію, але чому б не просто використати вбудований інструмент для розбору JSON та уникнути всіх цих проблем та небезпеки?