Вы также можете использовать 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 и избежать всех этих проблем и опасностей?