安全地使用eval来执行函数

2 投票
3 回答
1276 浏览
提问于 2025-04-15 19:44
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 这个东西本身就不安全,而且仍然容易受到攻击。

撰写回答