Рубрики
Без рубрики

Python Exec () – руководство хакера к опасной функции

Функция https://youtu.be/dhpda4qdgiu python () () () () () Python () выполняет код Python, который вы проходите в виде строки или исполняемого объекта. Это называется динамическим выполнением, потому что, в отличие от нормального статического кода Python, вы можете генерировать код и выполнить его во время выполнения. Таким образом, вы можете запустить программно созданный код Python. Вы когда-нибудь задавались вопросом о пределов … Python Exec () – руководство хакера к опасной функции Подробнее »

Автор оригинала: Chris.

Python’s EXEC () Функция выполняет код Python, который вы проходите в виде строки или исполняемого объекта аргумента. Это называется Динамическое исполнение потому что, в отличие от нормального Статический Код Python, вы можете генерировать код и выполнить его во время выполнения. Таким образом, вы можете запустить программно созданный код Python.

Вы когда-нибудь задумывались о пределах одной строки кода Python? Ну, нет никаких ограничений, если вы знаете эту одну мощную функцию. В этом руководстве показано, как использовать Встроенный Python EXEC () функция.

Примеры использования

Узнайте пример! Вот несколько примеров того, как использовать EXEC () Встроенная функция :

>>> program = 'print("hello world")'
>>> exec(program)
hello world

Во-первых, вы создаете программу, которая является только строкой, которая содержит код Python. Во-вторых, вы бежите EXEC (программа) Для выполнения программы в Python.

>>> exec('x=2; y=4; print(x+y)')
6

Предыдущий фрагмент кода, вы видели, как запустить несколько «строк кода» в одной строке кода Отказ Вы создаете две переменные х и у и распечатать сумму обоих. Вы сжимаете все эти линии в один, используя Semicolon ;

Вот как вы можете использовать EXEC () Заявление в пределах EXEC () Заявление, давая пользователю возможность запустить некоторый код в вашей среде. Будьте осторожны с этим! Это открывает все виды проблем с безопасностью, потому что любой пользователь может работать практически любую программу на вашем компьютере – кошмар для соображений безопасности!

>>> exec('x = input("Your code: "); exec(x)')
Your code: print('hi')
hi

Итак, как работает синтаксис формально?

Синтаксис EXEC ()

Вы можете использовать EXEC () Способ с тремя различными списками аргумента.

Syntax: 
exec(object)
exec(object, globals)
exec(object, globals, locals) 
Аргументы объект Строка или объект кода для выполнения.
глобали По желанию. Словарь, в котором вы можете определить переменные, которые должны быть во всем мире доступным на выполненном объекте (локальное пространство имен).
местные жители По желанию. Словарь, в котором вы можете определить переменные, которые должны быть локально доступны на выполненном объекте (глобальное пространство имен).
Возвращаемое значение Никто Возвращает ничего, но он все еще может иметь значительные побочные эффекты!

VITHON EXEC () Возвращаемое значение

Возвращаемое значение EXEC () это Нет Отказ Тем не менее, он может выполнить все виды функций со всеми видами побочных эффектов, таких как изменение структуры папки в вашей операционной системе, создавая новые файлы, развертывая троянскую лошадь или угнать свои биткойны.

Но прежде чем мы будем двигаться дальше, я рад представить вам мою новую книгу Python Python One-listers (Amazon Link).

Если вам нравятся одноклассники, вы будете любить книгу. Это научит вам все, что нужно знать о Одно строка кода Python. Но это тоже Введение в компьютерную науку , наука о данных, машин обучения и алгоритмы. Вселенная в одной строке Python!

Книга была выпущена в 2020 году с помощью книги по программированию мирового класса Nostarch Press (San Francisco).

Ссылка: https://nostarch.com/pythononeliners.

[Опасная зона] Python Exec () Ввод пользователя

Вы можете использовать EXEC () Функция для запуска кода, который типизирован динамически пользователем:

program = input('your code: ')
exec(program)

Это очень опасно, потому что пользователь действительно может выполнить любой код в вашей среде. Если вы запустите это на своем сервере, пользователь может попытаться удалить все файлы на вашем сервере! Например, пользователь может использовать команду OS.System ('RM -RF *') Удалить все файлы и папки.

Выполнение этих двух строк кода также может быть изящным:

your code: print('hi')
hi

Типы пользователей в Печать («Привет») как пользовательский ввод. Это воспринимается как строка «Печать (« Привет »)» , упакован в Программа Переменная, переданная в EXEC (программа) функция и выполнена.

Файл python exec ()

Как выполнить файл в переводчике Python?

Вы можете использовать следующий мощный одноклассник:

exec(open("filename.py").read())

EXEC () Функция запускает все содержимое файла filename.py на компьютере, на котором он выполнен.

Подумайте о том, что вы могли бы сделать с этим! Кто-то может развернуть все проекты на другой машине, если они получили доступ к EXEC () Функция на машине!

Глобалы Python Exec ()

По умолчанию Python передает все глобальные имена – те, с которыми вы можете получить с глобал () ИНТО EXEC () Функция, так что вы можете использовать переменные, которые вы определены за пределами EXEC () Функция:

x = 'Alice'

program = '''
def f():
    print(x)

f()
'''

exec(program)
# 'Alice'

Результатом этого исполнения является строка «Алиса» на вашей оболочке. Тем не менее, переменная х определяется за пределами программы, поэтому EXEC () Функция имеет доступ ко всему состоянию программы.

Если вы не хотите разрешать пользователям EXEC () Функция, чтобы иметь возможность получить доступ к всему состоянию программы, вы можете перезаписать глобальные имена, предоставив ваш пользовательский Словарь имена и их ценностей.

Вот как вы создаете чистый лист для вашего EXEC () Выполнение программы:

x = 'Alice'

program = '''
def f():
    print(x)

f()
'''

exec(program, dict())

Выход сейчас:

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\Finxter\Blog\HowToConvertBooleanToStringPython\code.py", line 14, in 
    exec(program, dict())
  File "", line 6, in 
  File "", line 3, in f
NameError: name 'x' is not defined

Причина этого NameError Это глобальная переменная х не является частью нового глобального пространства имен, потому что вы передали пустой словарь как глобал Аргумент в EXEC () функция.

Python Exec () Locals

Аналогичным образом вы можете пройти словарь как второй аргумент для EXEC () Функция настроить использование вашего локального пространства имен. В противном случае Python будет просто использовать глобальное пространство имен по умолчанию вашей программы в качестве локального пространства имен.

Это бросает nameeRor, потому что переменная х Не существует в глобальном пространстве имен – и поэтому он не виден в определении функции:

x = 'Alice'

program = '''
def f():
    print(x)


f()
'''


exec(program, dict(), {'x':42})

Однако, если вы используете переменную х В локальном контексте в вашей программной строке он работает!

x = 'Alice'
program = 'print(x)'
exec(program, dict(), {'x':42})
# OUTPUT: 42

Тот же выбор пустых глобальных слон (первый аргумент) и словарь местных слоев (второй аргумент) с определением переменной х приводит к резкому результату при доступе х в пределах разных пространств имен.

Python exec () vs eval ()

Python’s EXEC () Функция принимает программу Python, как строку или исполняемый объект и запускает его. Eval () Функция оценивает выражение и возвращает результат этого выражения. Есть две основные различия:

  • EXEC () Может выполнить все исходный код Python, тогда как Eval () можно оценить только выражения.
  • EXEC () всегда возвращается Нет , тогда как Eval () Возвращает результат оцениваемого выражения.
exec('x=2;y=2;z=x*y;print(z)')
# 4

print(eval('2*2'))
# 4

Python Exec () Импорт

Можете ли вы импортировать другие библиотеки или модули внутри EXEC () исполнение? Ответ да! Просто позвоните EXEC («Импорт XXX; ...») Для импорта библиотеки XXX в локальное пространство имен exec вычисление.

program = '''
import random
print(random.randint(0,9))
'''

exec(program)
# Example Output: 2

В моем исполнении вывод был 2 Но в вашем случае будет отличаться от характера случайной функции. Дело в том, что вы можете импортировать все стандартные библиотеки Python в пределах EXEC () Функция, используя стандарт Импорт XXX шаблон.

Это также работает, если вы используете случайный модуль в другом объеме (например, в функции):

program = '''
import random
def f():
    print(random.randint(0,9))
f()
'''

exec(program)
'''
4
'''

Python Exec () несколько строк

Вы можете просто запустить EXEC () Функция на нескольких строках кода Python с использованием оператора SEMICOLON для разделения операторов:

# Instead of ...
a = 2
b = 4
c = b/a
print(c)

# Write ...
exec('a=2;b=4;c=b/a;print(c)')

Это работает только в том случае, если нет никаких отступов кодовых блоков, таких как определения функций или если выступления. Если есть, просто используйте многослойную строку:

program = '''
a = 2
b = int(input('your number: '))
if b>a:
    print('Yes!')
'''

exec(program)

Меньше питоновый способ – использовать '\ N' характер вместо новых линий к Сохранить некоторое пространство.

program = "a = 2\nb = int(input('your number: '))\nif b>a:\n    print('Yes!')"
exec(program)

Резюме

Python’s EXEC () Способ выполняет код Python, который вы проходите в виде строки или исполняемого объекта аргумента.

>>> exec('x=2; y=4; print(x+y)')
6

Это называется Динамическое исполнение потому что, в отличие от нормального Статический Код Python, вы можете генерировать код и выполнить его во время выполнения. Таким образом, вы можете запустить программно созданный код Python.

Будьте осторожны, чтобы не допускать несанкционированных людей бежать на Python’s EXEC () На скорлупе Python на вашем компьютере или сервере, потому что он открывает все виды уязвимостей безопасности.

Я надеюсь, что вам понравилось статью! Чтобы улучшить свое образование Python, вы можете присоединиться к популярной академии по электронной почте Free Finxter:

Хотите увеличить свои навыки Python в веселой и легкой потребности? Рассмотрим следующие ресурсы и стать магистральным кодером!

Куда пойти отсюда?

Достаточно теории, давайте познакомимся!

Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?

Практические проекты – это то, как вы обостряете вашу пилу в кодировке!

Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?

Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.

Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.

Присоединяйтесь к свободному вебинару сейчас!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.