Большинство современных языков (которые так или иначе интерпретируются) имеют какую-то функцию оценки . Такая функция выполняет произвольный код языка, большую часть времени передаваемый в качестве основного аргумента в виде строки (разные языки могут добавлять больше функций в функцию eval).
Я понимаю, что пользователям нельзя разрешать выполнять эту функцию ( редактировать, то есть принимать прямо или косвенно произвольный ввод от произвольного пользователя для передачи eval
), особенно с программным обеспечением на стороне сервера, поскольку они могут заставить процесс выполнять вредоносный код. Таким образом, учебники и сообщества говорят нам не использовать eval. Однако во многих случаях eval полезен и используется:
- Пользовательские правила доступа к программным элементам (IIRC OpenERP имеет объект,
ir.rule
который может использовать динамический код Python). - Пользовательские вычисления и / или критерии (OpenERP имеет такие поля, чтобы разрешить пользовательские вычисления кода).
- Парсеры отчетов OpenERP (да, я знаю, я волнуюсь из-за материала OpenERP ... но это основной пример, который у меня есть).
- Кодирование эффектов заклинаний в некоторых ролевых играх.
Таким образом, они имеют хорошее применение, если они используются правильно. Основным преимуществом является то, что эта функция позволяет администраторам писать собственный код без необходимости создавать больше файлов и включать их (хотя в большинстве сред, использующих функции eval, также есть способ указать файл, модуль, пакет, ... для чтения).
Тем не менее, Eval является злом в массовой культуре. Такие вещи, как проникновение в вашу систему, приходят на ум.
Однако существуют и другие функции, которые могут быть вредными, если пользователи каким-либо образом к ним обращаются: отсоединение, чтение, запись (семантика файла), распределение памяти и арифметика указателей, доступ к модели базы данных (даже если не учитывать случаи инъекции SQL).
Таким образом, в основном, в большинстве случаев, когда какой-либо код написан неправильно или не отслеживается должным образом (ресурсы, пользователи, окружение, ...), код является злым и может привести даже к экономическим последствиям.
Но есть что-то особенное с eval
функциями (независимо от языка).
Вопрос : Есть ли исторический факт, что этот страх становится частью популярной культуры вместо того, чтобы уделять такое же внимание другим, возможно, опасным чертам?
eval
, а имеет внутреннюю функцию, safe_eval
которая подготавливает среду для предотвращения опасных действий кода. Однако были найдены ошибки, поскольку Python - довольно гибкий язык, и поэтому его трудно контролировать.