My Spider Sense เตือนฉันว่าการใช้eval()เพื่อแยกวิเคราะห์ JSON ขาเข้าเป็นความคิดที่ไม่ดี ฉันแค่สงสัยว่าJSON.parse()- ที่ฉันคิดว่าเป็นส่วนหนึ่งของ JavaScript ไม่ใช่ฟังก์ชันเฉพาะเบราว์เซอร์จะปลอดภัยกว่าหรือไม่
My Spider Sense เตือนฉันว่าการใช้eval()เพื่อแยกวิเคราะห์ JSON ขาเข้าเป็นความคิดที่ไม่ดี ฉันแค่สงสัยว่าJSON.parse()- ที่ฉันคิดว่าเป็นส่วนหนึ่งของ JavaScript ไม่ใช่ฟังก์ชันเฉพาะเบราว์เซอร์จะปลอดภัยกว่าหรือไม่
คำตอบ:
คุณมีความเสี่ยงที่จะถูกโจมตีมากขึ้นหากใช้eval: JSON เป็นส่วนย่อยของ Javascript และ json.parse จะแยกวิเคราะห์ JSON ในขณะที่evalจะเปิดประตูไว้สำหรับนิพจน์ JS ทั้งหมด
eval('alert(1)');ลอง
ทั้งหมด JSON.parseการใช้งานน่าจะใช้มากที่สุดeval()
JSON.parseใช้วิธีแก้ปัญหาของ Douglas Crockfordซึ่งใช้eval()ตรงบรรทัดที่ 497497
// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
j = eval('(' + text + ')');
ข้อดีของJSON.parseมันคือการตรวจสอบว่าอาร์กิวเมนต์นั้นถูกต้องไวยากรณ์ JSON
JSON.parse()ใน Firefox 28 และ Chromium 33 บนระบบ Linux Mint ของฉัน เร็วกว่าeval()ใน Firefox 2 เท่าและเร็วกว่า Chromium ถึง 4 เท่า ฉันไม่แน่ใจว่าคุณกำลังโพสต์ซอร์สโค้ดอะไร แต่ไม่ใช่สิ่งเดียวกันในเบราว์เซอร์ของฉัน
JSON.parse()การใช้งานแบบเนทีฟซึ่งปลอดภัยและเร็วกว่าeval()ตัวแยกวิเคราะห์ที่ใช้
ไม่ใช่ทุกเบราว์เซอร์ที่รองรับ JSON แบบเนทีฟดังนั้นจะมีบางครั้งที่คุณต้องใช้eval() กับสตริง JSON ใช้โปรแกรมแยกวิเคราะห์ JSON จากhttp://json.orgซึ่งจัดการทุกอย่างได้ง่ายขึ้นมากสำหรับคุณ
Eval() เป็นความชั่วร้าย แต่กับเบราว์เซอร์บางตัวมันเป็นความชั่วร้ายที่จำเป็น แต่คุณสามารถหลีกเลี่ยงได้ที่ไหนทำ !!!!!
มีความแตกต่างระหว่างสิ่งที่ JSON.parse () และ eval () จะยอมรับ ลองประเมินสิ่งนี้:
var x = "{\" shoppingCartName \ ": \" shopping_cart: 2000 \ "}"
eval(x) //won't work
JSON.parse(x) //does work
ดูตัวอย่างนี้
หากคุณแยกวิเคราะห์ JSON ด้วย evalคุณจะอนุญาตให้สตริงที่แยกวิเคราะห์มีอะไรก็ได้ดังนั้นแทนที่จะเป็นเพียงชุดข้อมูลคุณอาจพบว่าตัวเองกำลังเรียกใช้ฟังก์ชันหรืออะไรก็ตาม
นอกจากนี้ JSON ยังparseยอมรับพารามิเตอร์ aditional reviver ที่ให้คุณระบุวิธีจัดการกับค่าบางอย่างเช่นวันที่ (ข้อมูลเพิ่มเติมและตัวอย่างในเอกสารอินไลน์ที่นี่ )
JSON เป็นเพียงส่วนย่อยของ JavaScript แต่evalประเมินภาษา JavaScript แบบเต็มไม่ใช่เฉพาะส่วนย่อยที่เป็น JSON
JSON.parse(นำไปใช้โดยตรงกับเครื่องมือ JavaScript) จะแยกวิเคราะห์เฉพาะ JSON แต่การใช้งานอื่น ๆ ที่ไม่ได้ใช้โดยกำเนิดจะใช้การตรวจสอบความถูกต้องและใช้evalเพื่อเหตุผลด้านประสิทธิภาพ
JSON.parseเร็วกว่าevalอย่างน้อยที่สุดใน V8 (เครื่องยนต์ JS ของ Chromium) แหล่ง