我试图以(相对)安全的方式使用Python(2.7)eval
。因此,我定义:
def safer_eval(string):
"""Safer version of eval() as globals and builtins are inaccessible"""
return eval(string, {'__builtins__': {}})
正如预期的那样,以下内容不再有效:
^{pr2}$但是,我仍然可以计算"None"
字符串:
print safer_eval("None")
None
那么,None
不是内置的吗?
它们至少都是__builtin__
的一部分。。。
为什么它仍然可以评估?
在Python2.7中,这是一个完全有效的语句。在
不过,试着用
None
来做,然后。。在SyntaxError: cannot assign to None
会让你头晕目眩。不确定是常数。您可以将
True
更改为其他值,但不能更改None
。在None
是Python中的一个常量,请参见Keywords documentation:只要您将singleton
None
对象命名为:True
和{在Python3中,}都是{a2},而这三个都只是通过命名来实现的:
^{pr2}$None
、True
和{见Guido van Rossum's blog post on why this was changed。在
请注意,eval没有什么安全的地方,即使
__builtins__
被阉割,因为它仍然可以通过其他方式引用:或者,您可以简单地通过创建一个损坏的代码对象来炸毁解释器。见Eval really is dangerous。在
如果您只想加载Python文本语法(列表、元组、字典、字符串、数字等),那么您需要使用^{} function ,它是专门为安全而设计的。在
相关问题 更多 >
编程相关推荐