Как запретить импорт определенной библиотеки в exec() на python?

Пользователь

от francisco.friesen , в категории: Python , год назад

Как запретить импорт определенной библиотеки в exec() на python?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

Пользователь

от amaya_bahringer , год назад

@francisco.friesen 

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


Ниже приведен пример, который демонстрирует, как выполнить эту проверку:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
def safe_exec(code):
    try:
        exec(code)
    except ImportError as e:
        print(f"Импорт запрещен: {e}")
    except Exception as e:
        print(f"Произошла ошибка: {e}")

code = """
import math

def calculate_square_root(n):
    return math.sqrt(n)

result = calculate_square_root(4)
print(result)
"""

safe_exec(code)


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


В данном примере мы запрещаем импорт библиотеки math внутри exec(), поэтому при попытке импорта возникает ошибка ImportError, и мы выводим сообщение о запрете импорта.

Пользователь

от jerrold_langworth , 3 месяца назад

@francisco.friesen 

Как альтернативу, также можно использовать модуль ast (абстрактное синтаксическое дерево) для анализа переданного кода и проверять его на наличие определенных операций импорта перед его выполнением с помощью функции exec(). Например:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import ast

def safe_exec(code):
    try:
        tree = ast.parse(code)
        for node in ast.walk(tree):
            if isinstance(node, ast.Import) or isinstance(node, ast.ImportFrom):
                # Проверяем, что пытаются импортировать
                for alias in node.names:
                    if alias.name == 'math':
                        raise ImportError(f"Импорт библиотеки math запрещен")
        exec(compile(tree, filename="<string>", mode="exec"))
    except ImportError as e:
        print(f"Импорт запрещен: {e}")
    except Exception as e:
        print(f"Произошла ошибка: {e}")

code = """
import math

def calculate_square_root(n):
    return math.sqrt(n)

result = calculate_square_root(4)
print(result)
"""

safe_exec(code)


В этом примере мы используем модуль ast для разбора переданного кода и проверяем все операции импорта. Если какой-либо операции импорта пытается импортировать библиотеку math, мы поднимаем исключение ImportError. Таким образом, код выполняется только в том случае, если не происходит импорт запрещенной библиотеки.

Пользователь

от jose , 3 месяца назад

@francisco.friesen 

Вы правы, использование модуля ast для анализа кода перед его выполнением с помощью функции exec() является более точным способом блокировать определенные импорты. Этот метод позволяет программисту более точно контролировать операции, выполняемые внутри функции exec(), и предотвращать нежелательные импорты.


Таким образом, при использовании модуля ast для анализа и проверки кода перед его выполнением в функции exec(), можно более эффективно контролировать доступ к определенным библиотекам или функциональности в динамически выполненном коде.


Спасибо за ваш дополнительный пример и объяснение!