ส่วนใหญ่ภาษาสมัยใหม่ (ซึ่งจะถูกตีความอย่างใด) มีชนิดของบางEVALฟังก์ชั่น ฟังก์ชั่นดังกล่าวเรียกใช้งานรหัสภาษาโดยพลการส่วนใหญ่เวลาผ่านไปเป็นอาร์กิวเมนต์หลักเป็นสตริง (ภาษาที่แตกต่างกันอาจเพิ่มคุณสมบัติเพิ่มเติมให้กับฟังก์ชั่น eval)
ฉันเข้าใจว่าผู้ใช้ไม่ควรได้รับอนุญาตให้ใช้งานฟังก์ชั่นนี้ ( แก้ไขเช่นนำข้อมูลเข้าโดยตรงหรือโดยอ้อมจากผู้ใช้ที่ต้องการส่งผ่านeval
) โดยเฉพาะกับซอฟต์แวร์ฝั่งเซิร์ฟเวอร์เนื่องจากสามารถบังคับให้กระบวนการเรียกใช้รหัสที่เป็นอันตรายได้ ด้วยวิธีนี้บทเรียนและชุมชนบอกให้เราไม่ใช้การประเมินผล อย่างไรก็ตามมีหลายครั้งที่evalมีประโยชน์และใช้งานอยู่:
- กฎการเข้าถึงแบบกำหนดเองไปยังองค์ประกอบซอฟต์แวร์ (IIRC OpenERP มีวัตถุ
ir.rule
ที่สามารถใช้รหัสหลามแบบไดนามิก) - การคำนวณที่กำหนดเองและ / หรือเกณฑ์ (OpenERP มีฟิลด์เช่นนั้นเพื่ออนุญาตการคำนวณรหัสที่กำหนดเอง)
- ตัวแยกวิเคราะห์รายงาน OpenERP (ใช่ฉันรู้ว่าฉันทำให้คุณประหลาดใจกับสิ่งที่ OpenERP ... แต่มันเป็นตัวอย่างหลักที่ฉันมี)
- เอฟเฟกต์การสะกดในบางเกม RPG
ดังนั้นพวกเขาจึงมีการใช้งานที่ดีตราบใดที่พวกเขามีการใช้อย่างถูกต้อง ข้อได้เปรียบหลักคือคุณลักษณะนี้ช่วยให้ผู้ดูแลระบบสามารถเขียนโค้ดที่กำหนดเองโดยไม่ต้องสร้างไฟล์เพิ่มเติมและรวมไว้ด้วย (แม้ว่าเฟรมเวิร์กส่วนใหญ่ที่ใช้คุณสมบัติ eval ก็มีวิธีการระบุไฟล์โมดูลแพ็กเกจ ... เพื่ออ่านจาก)
อย่างไรก็ตาม eval เป็นสิ่งชั่วร้ายในวัฒนธรรมสมัยนิยม สิ่งที่ต้องการเจาะเข้าไปในระบบของคุณอยู่ในใจ
อย่างไรก็ตามมีฟังก์ชั่นอื่น ๆ ที่อาจเป็นอันตรายหากผู้ใช้เข้าถึง: ยกเลิกการเชื่อมโยงอ่านเขียน (ซีแมนทิกส์ไฟล์) การจัดสรรหน่วยความจำและเลขคณิตตัวชี้การเข้าถึงโมเดลฐานข้อมูล (แม้ว่าจะไม่พิจารณากรณี SQL-injectable)
ดังนั้นโดยทั่วไปแล้วส่วนใหญ่เวลาที่โค้ดใด ๆไม่ถูกเขียนอย่างถูกต้องหรือไม่ได้ดูอย่างถูกต้อง (ทรัพยากรผู้ใช้สภาพแวดล้อม ... ) รหัสนั้นชั่วร้ายและอาจนำไปสู่ผลกระทบทางเศรษฐกิจได้
แต่มีบางสิ่งที่พิเศษกับeval
ฟังก์ชั่น (โดยไม่คำนึงถึงภาษา)
คำถาม : มีข้อเท็จจริงทางประวัติศาสตร์สำหรับความกลัวนี้ที่กลายเป็นส่วนหนึ่งของวัฒนธรรมสมัยนิยมแทนที่จะให้ความสนใจแบบเดียวกันกับคุณลักษณะที่เป็นอันตรายอื่น ๆ หรือไม่?
eval
ว่ามันมีฟังก์ชั่นภายในที่เรียกว่าsafe_eval
ที่เตรียมสภาพแวดล้อมเพื่อป้องกันรหัสจากการทำสิ่งที่อันตราย อย่างไรก็ตามพบข้อบกพร่องเนื่องจาก Python เป็นภาษาที่ค่อนข้างยืดหยุ่นและควบคุมได้ยาก