Олег Марков
Как использовать функцию eval безопасно в Python
Введение
eval() — одна из самых мощных функций в Python. Она позволяет выполнить строку как Python-код: вычислить выражение, обработать формулу, динамически работать с переменными. В то же время это прямой доступ к интерпретатору, и при неправильном использовании он может выполнять вредоносный код.
В этой статье мы разберём, как работает eval(), какие угрозы связаны с его использованием и как применять функцию безопасно.
Что делает eval()
Функция принимает строку и возвращает результат её вычисления:
result = eval("2 + 5 * 3")
print(result) # 17Важно понимать, что eval() работает только с выражениями, а не с полноценными конструкциями вроде циклов или операторов присваивания.
Почему eval опасен
Если передавать в eval() строки, полученные от пользователя, он может выполнить любой Python-код:
malicious_input = "__import__('os').system('rm -rf /')"
eval(malicious_input) # Опасно!Риски использования:
- удаление или изменение файлов;
- доступ к системе и сети;
- внедрение вредоносного кода в приложение.
Основное правило — не использовать eval с непроверенным вводом.
Как сделать eval безопасным
Python позволяет ограничивать доступные имена, используя словари globals и locals:
allowed = {"x": 10, "y": 5}
result = eval("x + y", {"__builtins__": None}, allowed)
print(result) # 15Здесь мы отключили встроенные функции (__builtins__) и разрешили только переменные x и y.
Если нужно разрешить использование некоторых функций, их можно добавить в словарь:
import math
safe_env = {
"__builtins__": None,
"sin": math.sin,
"cos": math.cos,
"pi": math.pi
}
print(eval("sin(pi / 2)", safe_env)) # 1.0Теперь выражение может использовать только заранее разрешённые функции.
Когда eval можно использовать
Допустимо применять eval():
- для вычисления математических выражений;
- для динамических формул, где набор операций заранее известен;
- в закрытых системах без ввода данных пользователем;
- при строгом контроле окружения.
Если вы хотите детальнее погрузиться в работу с функциями и безопасным выполнением выражений — приходите на курс Основы Python. На курсе 209 уроков и 34 упражнения, AI-тренажёры для практики с кодом, решение задач с живым ревью наставника и еженедельные встречи с менторами.
Когда eval использовать нельзя
- при работе с непроверенным вводом;
- если безопасность важнее удобства;
- если есть безопасные альтернативы.
Альтернативы:
ast.literal_eval()— безопасная обработка литералов;- специальные парсеры для математических выражений;
- словарь функций для динамического вызова без eval.
Пример ast.literal_eval():
import ast
val = ast.literal_eval("[1, 2, 3]")
print(val) # [1, 2, 3]Он позволяет обрабатывать только литералы и безопасен по умолчанию.
Частые ошибки при использовании eval
- выполнение пользовательского ввода без проверок;
- доступ к встроенным объектам (
__builtins__); - использование
eval()вместо безопасных преобразований типов.
Заключение
eval() — мощный инструмент, который требует внимательного подхода. Чтобы использовать его безопасно, ограничивайте пространство имён, проверяйте входные данные и отдавайте предпочтение безопасным альтернативам там, где это возможно.
Если вы хотите глубже разобраться в особенностях Python и безопасной работе с встроенными функциями — изучайте курс Основы Python. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Python прямо сегодня.
Постройте личный план изучения Python до уровня Middle — бесплатно!
Python — часть карты развития Backend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Все гайды по Python
Лучшие курсы по теме

Основы Python
Антон Ларичев
Nest.js с нуля
Антон Ларичев