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) แหล่ง