- Eval в Python
- Сокрытые драгоценности Python
- Особенности Python, о которых я даже не подозревал
- 1. Атрибуты функций
- 2. Цикл for-else
- 3. Разделители для int
- 4. eval () и exec ()
- 5. Многоточие (Ellipsis)
- Логическое значение Многоточия
- Напутствие
- Python eval ()
- Параметры eval ()
- Возвращаемое значение из eval ()
- Пример 1: Как eval () работает в Python
- Пример 2: Практический пример демонстрации использования eval ()
- Предупреждения при использовании eval ()
- Ограничение использования доступных методов и переменных в eval ()
- 1. Если опущены и глобальные, и локальные параметры.
- 2. Передача глобальных параметров; параметр locals опущен
- Пример 3: передача пустого словаря в качестве параметра глобальных переменных
- Пример 4: Обеспечение доступности определенных методов
- Пример 5: Ограничение использования встроенных модулей
- 3. Передача как глобальных, так и локальных словаря
- Python eval() function
- Understanding Python eval() function
- Python eval() function with Pandas module
- Security issues with eval() function
- Summary
- Conclusion
- Python eval как работает
- Syntax¶
- Return Value¶
- Time Complexity¶
- Remarks¶
Eval в Python
Это интересная хакерская утилита в Python, которая позволяет программе Python запускать код Python внутри себя.
Метод eval () анализирует переданное ему выражение и запускает выражение (код) Python в программе.
Синтаксис eval :
Давайте рассмотрим это с помощью простой программы на Python:
return «Secret key is 1234»
# выражение для оценки
expr = raw_input ( «Enter the function(in terms of x):» )
# переменная, используемая в выражении
x = int ( raw_input ( «Enter the value of x:» ))
# печать оцененного результата
if __name__ = = «__main__» :
function_creator — это функция, которая оценивает математические функции, созданные пользователем.
Давайте немного проанализируем код:
Проблемы с уязвимостью в eval
Наша текущая версия function_creator имеет несколько уязвимостей.
Пользователь может легко раскрыть скрытые значения в программе или вызвать опасную функцию, так как eval выполнит все, что ему передано.
Например, если вы вводите так:
Также рассмотрим ситуацию, когда вы импортировали модуль os в вашу программу на python. Модуль os предоставляет переносимый способ использования функций операционной системы, таких как: чтение или запись файла. Одна команда может удалить все файлы в вашей системе!
Конечно, в большинстве случаев (например, настольные программы) пользователь не может сделать больше, чем он мог бы, написав свой собственный скрипт Python, но в некоторых приложениях (например, веб-приложения, компьютеры с киосками) это может быть риском!
Решение состоит в том, чтобы ограничить eval только теми функциями и переменными, которые мы хотим сделать доступными.
Сделать eval безопасным
Функция eval поставляется с возможностью явной передачи списка функций или переменных, к которым она может получить доступ. Нам нужно передать его в качестве аргумента в виде словаря.
Рассмотрим пример ниже:
return «Secret key is 1234»
# выражение для оценки
expr = raw_input ( «Enter the function(in terms of x):» )
# переменная, используемая в выражении
x = int ( raw_input ( «Enter the value of x:» ))
# передача переменной x в безопасном словаре
# печать оцененного результата
if __name__ = = «__main__» :
# список безопасных методов
# создание словаря безопасных методов
safe_dict = dict ([(k, locals ().get(k, None )) for k in safe_list])
Теперь, если мы попытаемся запустить вышеуказанную программу, как:
Давайте проанализируем приведенный выше код шаг за шагом:
locals () — это встроенный метод, который возвращает словарь, который отображает все методы и переменные в локальной области с их пространствами имен.
Таким образом, мы сделали нашу функцию eval безопасной от любых возможных взломов!
Использование Eval
eval не так часто используется по соображениям безопасности, как мы исследовали выше.
Тем не менее, это удобно в некоторых ситуациях, таких как:
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Сокрытые драгоценности Python
Особенности Python, о которых я даже не подозревал
В последнее время у меня появилось новое хобби – чтение документации Python просто для удовольствия! Когда вы читаете на досуге, то, как правило, замечаете интересные «лакомые кусочки», которые в противном случае пропустили бы. Итак, вот перечень «кусочков», которые заставили меня сказать:
О! Вы можете сделать это на Python?
1. Атрибуты функций
Подобно тому, как вы можете устанавливать атрибуты классов и объектов, вы также можете устанавливать атрибуты функций.
Мы установили атрибуты «optional_return» в строке 10 и «is_awesome» в строке 11. Мы получили доступ к этим атрибутам вне функции позднее в строках 19 и 20. Результат кода:
Это удобно, когда вы хотите, чтобы функция извлекала некую промежуточную переменную, но не возвращала её явно с оператором return каждый раз при вызове функции. Также обратите внимание, что атрибуты могут быть установлены как внутри определения функции, так и вне определения функции.
2. Цикл for-else
В Python вы можете добавить условие else в цикл for. Условие else будет срабатывать только в том случае, если во время выполнения в теле цикла не встретится оператор break.
All elements at least 3 letters long
Обратите внимание, что else имеет отступ на уровне for, а не на уровне if. Здесь ни один элемент не имеет длины короче трёх. Таким образом, никогда не будет встречен оператор break. Следовательно, условие else будет запущено (после выполнения цикла for) и выведется результат, указанный выше.
Можно утверждать, что этого можно достичь с помощью отдельной переменной, которая отслеживает встретился ли оператор break. И, возможно, для другого человека, читающего код, это будет также менее запутанно. Далее приведен эквивалентный путь достижения того же результата:
Думаю, это полезно знать.
3. Разделители для int
Трудно визуально различить целые числа подобные 10000000 и 100000000 (они даже разные числа?). Мы не можем использовать запятые здесь, в Python, подобному тому, как мы используем их в английском языке, потому что Python интерпретирует это как кортеж из нескольких целых чисел.
У Python есть очень удобный способ справиться с этим: мы можем использовать подчеркивание как разделитель для улучшения читабельности. Таким образом, 1_000_000 будет интерпретироваться как целое число.
4. eval () и exec ()
В Python есть возможность динамически считывать строку и обрабатывать её как часть Python кода. Это достигается использованием функций eval() и exec() (‘eval’ для вычисления выражений; и ‘exec’ для выполнения операторов).
В третьей строке функция eval() считывает входную строку как выражение Python, оценивает её и присваивает результат переменной b. В строке 6 функция exec() считывает входную строку как оператор Python и исполняет её.
В целом, в более широком контексте программирования (не только в отношении Python) использование eval/exec невероятно сильно, поскольку позволяет вам писать динамический код, который использует информацию, доступную во время выполнения, для решения проблем, которые не могут быть даже выражены во время компиляции. […] exec – это буквально интерпретатор Python, встроенный в Python, поэтому, если у вас есть особенно сложная проблема для разрешения, один из способов её решить – написать программу для *написания программы для её решения*, затем использовать exec для запуска этой второй программы.
Вы можете прочитать об этом в замечательном объяснении Стивена Д’Апрано.
5. Многоточие (Ellipsis)
5.1. Замена для ненаписанного кода
Подобно pass, константы можно использовать в качестве замены, когда код не полностью написан, но требует некоторого заполнения для синтаксической правильности.
5.2. Альтернатива NONE
None выбирают, когда хотят обозначить пустой ввод или возврат. Но иногда None может быть одним из ожидаемых входных или возвращаемых параметров функций. В этом случае Многоточие может служить заменой.
Функция nth_odd() вычисляет n-ое нечетное число, c учетом n. Функция original_num() вычисляет исходное число n, учитывая n-ое нечетное число. Здесь None – один из ожидаемых входных параметров функции original_num(), так что мы не можем использовать его как замену по умолчанию для аргумента m. Результат кода:
This function needs some input
Non integer input provided to nth_odd() function
9 is 5th odd number
16 is not an odd number
5.3. Нарезка массива в NumPy
NumPy использует многоточие для нарезки массива. Следующий код показывают два эквивалентных способа нарезки:
[ 0 2 4 6 8 10 12 14]
[ 0 2 4 6 8 10 12 14]
Таким образом, ‘…’ показывает, что существует столько ‘:’, сколько необходимо.
Логическое значение Многоточия
TL; DR
Итак, я обнаружил следующие интересные особенности.
Атрибуты Функций: присвоение атрибутов функциям, как и объектам.
Цикл for-else: отслеживание, был ли цикл выполнен без оператора break.
Разделители для int: 32_534_478 – это int.
eval() и exec(): читайте строки как код Python и запустите его.
Многоточие: универсальная встроенная константа.
Напутствие
Python – это не только полезный язык, но и действительно интересный. Все мы заняты своей жизнью, но это не мешает узнавать язык ради него самого. Я бы хотел узнать больше о Пасхальных Яйцах, которые вы, возможно, найдёте.
Python eval ()
Метод eval () анализирует выражение, переданное этому методу, и запускает выражение (код) Python в программе.
Проще говоря, eval() функция запускает код Python (который передается в качестве аргумента) внутри программы.
Параметры eval ()
eval() Функция принимает три параметра:
Использование глобальных и локальных переменных будет обсуждаться позже в этой статье.
Возвращаемое значение из eval ()
Метод eval () возвращает результат, вычисленный на основе выражения.
Пример 1: Как eval () работает в Python
Вывод
Здесь eval() функция оценивает выражение x + 1 и print используется для отображения этого значения.
Пример 2: Практический пример демонстрации использования eval ()
Вывод
Предупреждения при использовании eval ()
Рассмотрим ситуацию, когда вы используете систему Unix (macOS, Linux и т. Д.) И импортировали os модуль. Модуль os предоставляет переносимый способ использования функций операционной системы, таких как чтение или запись в файл.
Если вы используете eval(input()) в своем коде, рекомендуется проверить, какие переменные и методы может использовать пользователь. Вы можете увидеть, какие переменные и методы доступны, используя метод dir ().
Вывод
Ограничение использования доступных методов и переменных в eval ()
1. Если опущены и глобальные, и локальные параметры.
Если оба параметра опущены (как в наших предыдущих примерах), выражение выполняется в текущей области. Вы можете проверить доступные переменные и методы, используя следующий код:
2. Передача глобальных параметров; параметр locals опущен
Параметры globals и locals (словари) используются для глобальных и локальных переменных соответственно. Если словарь locals опущен, по умолчанию используется словарь globals. Это означает, что глобальные переменные будут использоваться как для глобальных, так и для локальных переменных.
Примечание. Вы можете проверить текущий глобальный и локальный словарь в Python, используя встроенные методы globals () и locals () соответственно.
Пример 3: передача пустого словаря в качестве параметра глобальных переменных
Вывод
Если вы передадите пустой словарь как глобал, только __builtins__ доступны expression (первый параметр eval() ).
Несмотря на то, что мы импортировали math модуль в вышеуказанную программу, выражение не может получить доступ к функциям, предоставляемым математическим модулем.
Пример 4: Обеспечение доступности определенных методов
Вывод
Также можно изменить имя метода, доступного для выражения, по вашему желанию:
Вывод
Пример 5: Ограничение использования встроенных модулей
Вы можете ограничить использование __builtins__ в выражении следующим образом:
3. Передача как глобальных, так и локальных словаря
Вы можете сделать необходимые функции и переменные доступными для использования, передав словарь locals. Например:
Вывод
В этой программе выражение может иметь только sqrt() метод и переменную a. Все остальные методы и переменные недоступны.
Ограничение использования eval() путем передачи глобальных и локальных словарей сделает ваш код безопасным, особенно когда вы используете ввод, предоставленный пользователю для eval() метода.
Python eval() function
Hello, readers. In this article we will be focusing on Python eval() function.
Understanding Python eval() function
Python eval() function converts and computes the expressions passed to it.
NOTE: Use this method only for testing purposes. The eval() function does not sanitize the expressions passed to it. It can easily become a loophole into your server if malicious users execute Python code here.
The eval() function parses the python expressions and runs the code passed to it as a parameter within the python program.
Syntax:
Example 1: Passing expression to add two local variables
In the above snippet of code, we have passed an expression ‘a+b’ to the eval() function in order to add two local variables: a, b.
Output:
Example 2: Python eval() function with user input
In the above example, we have accepted the input from the user and assigned the same to the variables. Further, we have passed the expression for the multiplication of those two input values.
Output:
Python eval() function with Pandas module
Python eval function can also operate with Pandas Module. The pandas.eval() function accepts the expression and executes the same within the python program.
Syntax:
Example 1: Passing an expression with inplace = TRUE
In the above example, we have created a dataframe and have passed an expression to be executed within the python script.
As the inplace is set to TRUE, the data values obtained from the expression will be stored in the same dataframe object ‘data’.
Output:
Example 2: Executing expression within python script with inplace = FALSE
In the above snippet of code, we have passed inplace = FALSE to the eval() function. Thus, the results of the python expression will be stored in a new dataframe object ‘data1’.
Output:
Security issues with eval() function
Summary
Conclusion
Therefore, in this article, we have understood the working and the vulnerabilities of Python eval() function.
Python eval как работает
Returns a result of the evaluation of a Python expression.
Syntax¶
eval (expression[, globals[, locals]])
expression Required. The arguments are a Unicode or Latin-1 encoded string globals Optional. A dictionary defining the namespace in which the expression is evaluated. locals Optional. A dictionary defining the local namespace.
Return Value¶
Time Complexity¶
Remarks¶
The expression argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the globals and locals dictionaries as global and local namespace. If the globals dictionary is present and lacks ‘__builtins__’, the current globals are copied into globals before expression is parsed. This means that expression normally has full access to the standard __builtin__ module and restricted environments are propagated. If the locals dictionary is omitted it defaults to the globals dictionary. If both dictionaries are omitted, the expression is executed in the environment where eval() is called. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions.
This function can also be used to execute arbitrary code objects (such as those created by compile()). In this case pass a code object instead of a string. If the code object has been compiled with ‘exec’ as the mode argument, eval()‘s return value will be None. Hints: dynamic execution of statements is supported by the exec statement. Execution of statements from a file is supported by the execfile() function. The globals() and locals() functions returns the current global and local dictionary, respectively, which may be useful to pass around for use by eval() or execfile().