Anda juga bisa menggunakan eval()
tetapi JSON.parse()
lebih aman dan lebih mudah, jadi mengapa Anda mau?
bagus dan bekerja
var yourJsonObject = JSON.parse(json_as_text);
Saya tidak melihat alasan mengapa Anda lebih suka menggunakannya eval
. Itu hanya menempatkan aplikasi Anda dalam risiko.
Yang mengatakan - ini adalah juga mungkin.
buruk - tetapi juga berfungsi
var yourJsonObject = eval(json_as_text);
Mengapa itu eval
ide yang buruk?
Perhatikan contoh berikut.
Beberapa pihak ketiga atau pengguna menyediakan data string 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"
}]
`;
Skrip sisi server Anda memproses data itu.
Menggunakan JSON.parse
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = JSON.parse(json)[0].adjacencies[0].nodeTo;
}
akan melempar:
Uncaught SyntaxError: Unexpected token u in JSON at position X.
Fungsi tidak akan dieksekusi.
Kamu aman.
Menggunakan eval()
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = eval(json)[0].adjacencies[0].nodeTo;
}
akan menjalankan fungsi dan mengembalikan teks.
Jika saya mengganti fungsi yang tidak berbahaya itu dengan yang menghapus file dari folder situs web Anda, Anda telah diretas. Tidak ada kesalahan / peringatan akan dilemparkan dalam contoh ini.
Anda TIDAK aman.
Saya bisa memanipulasi string teks JSON sehingga berfungsi sebagai fungsi yang akan dijalankan di server.
eval(JSON)[0].adjacencies[0].nodeTo
mengharapkan untuk memproses string JSON tetapi, pada kenyataannya, kami baru saja menjalankan suatu fungsi pada server kami.
Ini juga bisa dicegah jika kita sisi server memeriksa semua data yang disediakan pengguna sebelum meneruskannya ke eval()
fungsi tetapi mengapa tidak hanya menggunakan alat bawaan untuk mem-parsing JSON dan menghindari semua masalah dan bahaya ini?