使用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安全地执行功能

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

现在我可以不再调用myFunc。我如何解决这个问题,而不会让eval开放利用?

+0

@ S.Lott,'eval'总是引入一个安全漏洞,但不是那个特定的安全漏洞;语句(包括'import')不能在只评估表达式的'eval'中执行。 – 2010-02-25 18:44:36

+0

@Mike:注意'__import__'函数:http://docs.python.org/library/functions.html#__import__ – 2010-02-25 19:13:43

+3

**没有办法使'eval'安全。**只需隐藏内建函数甚至没有开始解决这个问题。例如,撤销代码可以很容易地从myFunc.func_globals ['__ builtins __']'中取回它们。 – bobince 2010-02-25 19:23:36

这将允许您使用myFunc

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

然而,正如其他人所指出的那样,使用eval本质上是不安全,而且还vulnerabe战功。

+1

这确实可以访问'myFunc',但并未完成执行该功能的总体目标牢固。 'eval'不能用于此,特别是不容易。 – 2010-02-25 19:31:53

您的问题“我如何解决这个问题,而不会让eval开放给漏洞利用?”,是不正确的 - eval很容易受到漏洞攻击。不将__builtins__引入评估代码的全局名称空间不会使__builtin__模块无法访问,并且不会关闭其他入口点。

如果您更多地解释了您试图解决的问题,有人可能会提出一个安全选项来实现您的目标。

+0

我知道有更安全的选择,但我有一个学校作业,说我必须在这个特定的脚本中使用'eval'(尽管我仍然可以让它处理'''* 10000000',这样Python就会变得疯狂) 。 – Pieter 2010-02-26 08:33:36

+0

好的,请记住,即使使用上面的代码,由于您使用'eval'卡住,您的脚本将容易受到包括不可能长时间计算在内的攻击以及针对您的愿望访问'__builtins__'的攻击。如果你希望安全地执行任意Python代码,你可以在操作系统级上对沙盒解释器进行沙盒处理,并在监督器下运行它,就像他们在http://codepad.org/上一样,但我怀疑你真的很在意去解决这个问题为你的任务。 – 2010-02-26 16:14:12

如果您需要演示如何eval仍然是危险的,即使删除了内置程序,请参阅:Eval really is dangerous。有一些例子可以让CPython解释器或者直接退出CPython解释器。