安全地使用eval来执行功能

时间:2010-02-25 18:06:14

标签: python eval

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 个答案:

答案 0 :(得分:1)

这样您就可以使用myFunc

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

然而,正如其他人所指出的那样,使用eval本质上是不安全的,并且仍然可以利用漏洞。

答案 1 :(得分:1)

您的问题“我如何在不让eval对攻击开放的情况下解决这个问题?”,这不是正确的问题 - eval容易受到攻击,期间。不将__builtins__引入评估代码的全局命名空间不会使__builtin__模块无法访问,也不会关闭其他入口点。

如果您解释了有关您尝试解决的问题的更多信息,可能会有人建议一个安全选项来实现您的目标。

答案 2 :(得分:0)

如果您需要演示即使删除了内置版,eval仍然存在危险,请参阅:Eval really is dangerous。有一些例子可以解析CPython解释器,或直接退出它。