Sebagian besar bahasa modern (yang entah bagaimana ditafsirkan) memiliki semacam fungsi eval . Fungsi semacam itu mengeksekusi kode bahasa yang arbitrer, sebagian besar waktu berlalu sebagai argumen utama sebagai string (bahasa yang berbeda dapat menambahkan lebih banyak fitur ke fungsi eval).
Saya memahami pengguna tidak boleh diizinkan untuk menjalankan fungsi ini ( sunting yaitu mengambil input arbitrase langsung atau tidak langsung dari pengguna arbitrer untuk diteruskan eval
), terutama dengan perangkat lunak sisi server, karena mereka dapat memaksa proses untuk mengeksekusi kode berbahaya. Dengan cara itu, tutorial dan komunitas memberi tahu kami untuk tidak menggunakan eval. Namun, ada beberapa kali eval berguna dan digunakan:
- Aturan akses khusus ke elemen perangkat lunak (IIRC OpenERP memiliki objek
ir.rule
yang dapat menggunakan kode python dinamis). - Perhitungan dan / atau kriteria khusus (OpenERP memiliki bidang seperti itu untuk memungkinkan perhitungan kode khusus).
- Parser laporan OpenERP (ya saya tahu saya membuat Anda takut dengan hal-hal OpenERP ... tapi itu adalah contoh utama yang saya miliki).
- Coding efek mantra di beberapa game RPG.
Jadi mereka memiliki penggunaan yang baik, selama mereka digunakan dengan benar. Keuntungan utama adalah bahwa fitur memungkinkan admin untuk menulis kode khusus tanpa harus membuat lebih banyak file dan memasukkannya (meskipun sebagian besar kerangka kerja menggunakan fitur eval juga memiliki cara untuk menentukan file, modul, paket, ... untuk membaca dari).
Namun, eval adalah kejahatan dalam budaya populer. Hal-hal seperti membobol sistem Anda datang ke pikiran.
Namun, ada fungsi lain yang bisa berbahaya jika entah bagaimana diakses oleh pengguna: memutuskan tautan, membaca, menulis (semantik file), alokasi memori dan aritmatika pointer, akses model database (bahkan jika tidak mempertimbangkan kasus SQL-injeksi).
Jadi, pada dasarnya, sebagian besar waktu ketika kode apa pun tidak ditulis dengan benar atau tidak ditonton dengan benar (sumber daya, pengguna, lingkungan, ...), kode tersebut jahat dan bahkan dapat mengakibatkan dampak ekonomi.
Tapi ada sesuatu yang spesial dengan eval
fungsi (terlepas dari bahasa)
Pertanyaan : Apakah ada fakta historis untuk rasa takut ini menjadi bagian dari budaya populer, alih-alih memberikan perhatian yang sama pada fitur-fitur berbahaya lainnya?
eval
, ia memiliki fungsi internal yang disebut safe_eval
sedang mempersiapkan lingkungan untuk mencegah kode melakukan hal-hal berbahaya. Bug telah ditemukan, karena Python adalah bahasa yang cukup fleksibel, dan karenanya sulit dikendalikan.