gpt4 book ai didi

python - 在此示例中, `eval()` 如何不是 'dangerous'

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:21 25 4
gpt4 key购买 nike

我正在检查一个计算器示例,在该示例中使用了 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 模块的访问权限——这正是您试图限制的访问。

关于python - 在此示例中, `eval()` 如何不是 'dangerous',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28100471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com