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