คุณยังสามารถใช้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 และหลีกเลี่ยงปัญหาและอันตรายทั้งหมด?