安全地使用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
如果你想看看即使去掉了一些内置功能,eval 仍然是多么危险,可以看看这个链接: eval 确实很危险。里面有一些例子,展示了如何让 CPython 解释器崩溃,或者直接退出它。
1
你的问题“我怎么能在不让eval
受到攻击的情况下修复这个?”其实问错了——eval
本身就是容易被攻击的,没办法避免。即使不把__builtins__
引入到被评估代码的全局命名空间中,也并不能阻止访问__builtin__
模块,而且也无法堵住其他的攻击入口。
如果你能多解释一下你想解决的问题,也许会有人能给你提供一个安全的解决方案,帮助你实现目标。
1
这段话的意思是,你可以使用 myFunc
这个函数:
eval(input, {"__builtins__": {}, "myFunc": myFunc})
不过,正如其他人提到的,使用 eval
这个东西本身就不安全,而且仍然容易受到攻击。