您也可以使用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并避免所有这些麻烦和危险,这也可以避免。