Некоторые методы обеспечения безопасности при использовании функции eval в Python:
- Ограничение глобальной и локальной областей видимости. 14 Для этого нужно передать в качестве аргумента eval словарь с разрешёнными глобальными и локальными переменными. 4
- Ограничение доступа к builtins. 13 Это встроенный в Python объект, который содержит стандартные функции, объекты и исключения. 1 Чтобы ограничить доступ, нужно передать вместо него пустой словарь. 3
- Определение белого списка разрешённых операций. 2 Нужно определить список разрешённых операций, функций и переменных, которые могут использоваться в оцениваемом выражении, и ограничить выражение только этими разрешёнными элементами. 2
- Использование модуля ast. 4 Он позволяет анализировать и оценивать выражение без его выполнения, то есть проверять валидность входного выражения перед передачей его в eval. 4 Модуль также предоставляет белый список имён, используемых во входе, что позволяет использовать только разрешённые имена. 4
- Ограничение входа только на литералы. 4 Если ограничить eval принимать только литералы, это помешает пользователю ввести и выполнить вредоносный код. 4
- Использование функции literal_eval(). 5 Она не позволяет запускать код из другого модуля, а только обрабатывает данные типа Python. 5 При попытке выполнить вредоносный код из ненадёжного источника возникает исключение ValueError. 5
Также по возможности стоит избегать использования eval и использовать альтернативные подходы, например встроенные функции, библиотеки или настраиваемые парсеры, которые обеспечивают желаемую функциональность без выполнения произвольного кода. 2