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
对攻击开放?
答案 0 :(得分:1)
这样您就可以使用myFunc
:
eval(input, {"__builtins__": {}, "myFunc": myFunc})
然而,正如其他人所指出的那样,使用eval
本质上是不安全的,并且仍然可以利用漏洞。
答案 1 :(得分:1)
您的问题“我如何在不让eval
对攻击开放的情况下解决这个问题?”,这不是正确的问题 - eval
容易受到攻击,期间。不将__builtins__
引入评估代码的全局命名空间不会使__builtin__
模块无法访问,也不会关闭其他入口点。
如果您解释了有关您尝试解决的问题的更多信息,可能会有人建议一个安全选项来实现您的目标。
答案 2 :(得分:0)
如果您需要演示即使删除了内置版,eval仍然存在危险,请参阅:Eval really is dangerous。有一些例子可以解析CPython解释器,或直接退出它。