如何在Python 3.5中正确限制eval中的__builtins__?

时间:2016-10-22 23:00:34

标签: python python-2.7 python-3.x eval

在python 2.7中,我可以通过将global定义为__builtins__来限制eval使用的{'__builtins__': None}命名空间。这在Python 3.5中似乎不起作用。

Python 2.7正确地给出了NameError:

In [1]: eval('round', {'__builtins__': None})
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-14-dc1cae9c6b26> in <module>()
----> 1 eval('round', {'__builtins__': None})

<string> in <module>()

NameError: name 'round' is not defined

Python 3.5提供以下内容:

In [1]: eval('round', {'__builtins__': None})
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-83a8846287f1> in <module>()
----> 1 eval('round', {'__builtins__': None})

<string> in <module>()

TypeError: 'NoneType' object is not subscriptable

两者都为以下内容提供了正确的输出:

In [1]: eval('round')
Out[1]: <function round>

如何正确限制__builtins__或解决此问题?

1 个答案:

答案 0 :(得分:2)

您可以将其设置为空字典:

eval('round', {'__builtins__': {}})

这将重现Python 2.x中的NameError。但是,沙盒Python(无论是2还是3)都是inherently hard problem。如果可能,您应该使用功能较弱的内容,例如ast.literal_eval()而不是eval()