我正在检查一个计算器示例,在使用的示例中,该示例eval()
通常很危险,但这是该示例的一部分;
if button == "=":
#Check carefully how we using the 'dangerous' eval()
total = eval(str1,{"__builtins__":None},{})
str1 = str(total)
print (str1)
我检查了一下,但听不懂。怎么eval(str1,{"__builtins__":None},{})
不危险?{"__builtins__":None},{}
显然是关于这部分的,但是我不明白。
注意:这str1
是一个字符串,我们要添加数字和符号4+5
。然后eval()
处理它。
该代码一点也不安全。builtins
仅通过访问文字的属性来访问模块相对容易。
例如。
result = eval("""[klass for klass in ''.__class__.__base__.__subclasses__()
if klass.__name__ == "BuiltinImporter"][0].load_module("builtins")""",
{"__builtins__":None},{})
assert result is __builtins__
细分:
''.__class__.__base__
是的简写 object
object.__subclasses__()
列出object
解释器中的所有子类(包括导入机制使用的类[klass for klass in ... if klass.__name__ == "BuiltinImporter"][0]
-选择BuiltinImporter
课程。load_module("builtins")
使用BuiltinImporter
来获取对builtins
模块的访问权限-您正试图限制对其的访问。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句