根据PyPy docs,“内置名称始终引用内置模块,而不是有时在CPython中的字典。分配给< strong> builtins 没有效果。“例如在CPython中:
>>> eval("__import__('os').system('clear')", {'__builtins__':{}})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name '__import__' is not defined
在PyPy中,它运行它没有错误。是否有另一种限制内置可用的方法?
答案 0 :(得分:2)
不,很久以前就决定我们不提供这个。也许我们现在可以重新考虑它,但请注意它只会给人一种虚假的安全感。即使您使用{'__builtins__':{}}
的技巧,在第三方提供的字符串上调用eval()也永远不会安全。请参阅Python: make eval safe。