Bạn cũng có thể sử dụng eval()
nhưng cách JSON.parse()
an toàn và dễ dàng hơn, vậy tại sao bạn lại như vậy?
tốt và làm việc
var yourJsonObject = JSON.parse(json_as_text);
Tôi không thấy bất kỳ lý do tại sao bạn muốn sử dụng eval
. Nó chỉ đặt ứng dụng của bạn có nguy cơ.
Điều đó nói rằng - đây là cũng có thể.
xấu - nhưng cũng hoạt động
var yourJsonObject = eval(json_as_text);
Tại sao là eval
một ý tưởng tồi?
Hãy xem xét ví dụ sau.
Một số bên thứ ba hoặc người dùng đã cung cấp dữ liệu chuỗi 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"
}]
`;
Kịch bản phía máy chủ của bạn xử lý dữ liệu đó.
Sử dụng JSON.parse
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = JSON.parse(json)[0].adjacencies[0].nodeTo;
}
sẽ ném:
Uncaught SyntaxError: Unexpected token u in JSON at position X.
Chức năng sẽ không được thực thi.
Bạn an toàn rồi.
Sử dụng eval()
:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = eval(json)[0].adjacencies[0].nodeTo;
}
sẽ thực thi chức năng và trả về văn bản.
Nếu tôi thay thế chức năng vô hại đó bằng chức năng xóa các tệp khỏi thư mục trang web của bạn, bạn đã bị hack. Không có lỗi / cảnh báo sẽ bị ném trong ví dụ này.
Bạn KHÔNG an toàn.
Tôi đã có thể thao tác một chuỗi văn bản JSON để nó hoạt động như một hàm sẽ thực thi trên máy chủ.
eval(JSON)[0].adjacencies[0].nodeTo
mong đợi xử lý một chuỗi JSON nhưng trên thực tế, chúng tôi chỉ thực hiện một chức năng trên máy chủ của mình.
Điều này cũng có thể được ngăn chặn nếu phía máy chủ của chúng tôi kiểm tra tất cả dữ liệu do người dùng cung cấp trước khi chuyển nó sang một eval()
chức năng nhưng tại sao không sử dụng công cụ tích hợp để phân tích JSON và tránh tất cả những rắc rối và nguy hiểm này?