(Nasılsa yorumlanır) En modern diller çeşit var eval işlevi. Böyle bir işlev, çoğu zaman bir dize olarak ana argüman olarak geçirilen keyfi dil kodunu çalıştırır (farklı diller, değerlendirme işlevine daha fazla özellik ekleyebilir).
Anladığım kadarıyla kullanıcıların bu işlevi yerine getirmelerine izin verilmemelidir ( düzenleme, yani iletilecek keyfi bir kullanıcıdan doğrudan veya dolaylı olarak rastgele girdi alma eval
), özellikle de sunucu tarafı yazılımıyla, işlemi kötü amaçlı kod yürütmeye zorlayabileceklerinden eminim. Bu şekilde, öğreticiler ve topluluklar için bize değil eval kullanın. Ancak, birçok zamanlar vardır eval faydalı ve kullanılır:
- Yazılım öğelerine özel erişim kuralları (IIRC OpenERP,
ir.rule
dinamik python kodunu kullanabilen bir nesneye sahiptir). - Özel hesaplamalar ve / veya ölçütler (OpenERP, özel kod hesaplamalarına izin vermek için böyle alanlara sahiptir).
- OpenERP rapor ayrıştırıcıları (evet, sizi OpenERP olaylarından korktuğumu biliyorum ... ama sahip olduğum ana örnek bu).
- Bazı RPG oyunlarında kod yazım efektleri.
Bu yüzden, doğru kullanıldığı sürece, iyi bir kullanımları vardır. En önemli avantaj, özelliğin yöneticilere daha fazla dosya oluşturmak ve bunları eklemek zorunda kalmadan özel kod yazmasına izin vermesidir (eval özelliklerini kullanan birçok çerçevenin de bir dosya, modül, paket, ... okuyabileceği bir yolu olmasına rağmen).
Bununla birlikte, eval popüler kültürde kötüdür. Sisteminize girmek gibi şeyler akla geliyor.
Ancak, kullanıcılar tarafından bir şekilde erişilirse zararlı olabilecek başka işlevler de vardır: bağlantıyı kes, oku, yaz (dosya anlambilimi), bellek tahsisi ve işaretçi aritmetiği, veritabanı modeli erişimi (SQL-enjekte edilebilir durumlar düşünülmese bile).
Yani temel olarak çoğu zaman hiçbir kod yazılmaz düzgün ya da değil izledi düzgün (kaynaklar, kullanıcılar, ortamlar, ...), kod kötülük ve hatta ekonomik etkiye yol açabilir.
Ancak eval
fonksiyonlarla ilgili özel bir şey var (dilden bağımsız).
Soru : Bu korkunun, diğer muhtemel tehlikeli özelliklere aynı dikkati vermek yerine, popüler kültürün bir parçası haline gelmesinin tarihsel bir gerçeği var mı?
eval
dahili bir işlevi safe_eval
olduğu unutulmamalıdır. Python oldukça esnek bir dil olduğundan ve kontrol etmesi zor olduğu için hatalar bulundu.