x=5
print(eval('x+1',{'__builtins__': None}))
获取错误:
TypeError: 'NoneType' object is not subscriptable
为什么我会遇到以上错误?
此外,如何仅为eval()函数指定一些内置方法?例如,仅允许max
和min
函数。
答案 0 :(得分:6)
__builtins__
的值通常是该模块[builtins]或该模块的__dict__
属性的值
要纠正您的错误:
>>> print(eval('x+1',{'__builtins__': {'x': x}}))
要指定一些内置方法,请将其提供给__builtins__
>>> print(eval('min(1,2)',{'__builtins__': {'min': min}}))
但是,限制__builtins__
仍然不安全:请参见https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
答案 1 :(得分:1)
为什么我会遇到错误?
Python尝试在您提供的内置文件中寻找名称'x'
,但失败了:
>>> None['x']
TypeError: 'NoneType' object is not subscriptable
您还需要在范围内包括x
:
>>> x = 5
>>> eval('x+1', {'__builtins__': None, 'x': x})
6
如何仅为
eval()
函数指定一些内置方法?
您不能用这种方式沙箱。总是有可能逃脱沙箱,例如通过对文字的属性访问。
答案 2 :(得分:0)
一种可能的解决方案是让当前的全局变量清除内置变量
x=5
dictionary = globals()
dictionary['__builtins__'] = None
print(eval('x+1',dictionary))
答案 3 :(得分:0)
与之相同的原因也是为什么您没有得到定义'x':
x=5
print(eval("x+1",{'__builtins__': __builtins__}))
您得到:NameError: name 'x' is not defined
,因为您覆盖了所有上下文。
但如果您只是这样做:
x=5
print(eval("x+1"))
将打印'6',但将使用所有内置函数,也许您只想这样做:
x=5
print(eval("x+1",{'__builtins__': {'min': min, 'max': max, 'x': x}}))