Использование eval безопасно для выполнения функций - PullRequest
2 голосов
/ 25 февраля 2010
def myFunc(arg1, arg2):
    print "This is a test with " + arg1 + " and " + arg2

while (input != "quit"):
    input = raw_input("> ")

    if input != "quit":
        eval(input)

Этот код выдает мне приглашение, позволяющее мне вызывать myFunc с параметрами, которые я хочу. Я знаю, что eval может быть опасно, если словарь не предоставлен, поэтому я добавил это:

eval(input, {"__builtins__": {} }

Теперь я больше не могу вызывать myFunc. Как я могу это исправить, не оставляя eval открытым для эксплойтов?

Ответы [ 3 ]

1 голос
/ 25 февраля 2010

Ваш вопрос: «Как я могу это исправить, не оставляя eval открытым для эксплойтов?», Не правильный - eval уязвим для эксплойтов, точка. Отсутствие __builtins__ в глобальном пространстве имен оцениваемого кода не делает невозможным доступ к модулю __builtin__ и не закрывает другие точки входа.

Если вы более подробно рассказали о проблеме, которую пытаетесь решить, кто-то может предложить безопасный вариант для достижения ваших целей.

1 голос
/ 25 февраля 2010

Это позволит вам использовать myFunc:

eval(input, {"__builtins__": {}, "myFunc": myFunc})

Однако, как отмечали другие, использование eval изначально небезопасно и по-прежнему уязвимо для эксплойтов.

0 голосов
/ 10 июня 2012

Если вам нужна демонстрация того, как eval по-прежнему опасен даже после удаления встроенных элементов, посмотрите следующее: Eval действительно опасен . Там есть примеры segfaulting интерпретатора CPython или выхода из него напрямую.

...