あなたも使うことができます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;
}
関数を実行し、テキストを返します。
その無害な機能をWebサイトのフォルダーからファイルを削除する機能に置き換えると、ハッキングされたことになります。この例では、エラー/警告はスローされません。
あなたは安全ではありません。
JSONテキスト文字列を操作して、サーバー上で実行される関数として機能させることができました。
eval(JSON)[0].adjacencies[0].nodeTo
JSON文字列を処理することを期待していますが、実際には、サーバーで関数を実行しただけです。
これは、eval()
関数に渡す前にユーザー提供のすべてのデータをサーバー側でチェックする場合にも防止できますが、JSONを解析するための組み込みツールを使用して、このようなトラブルや危険をすべて回避しないのはなぜですか?