在这个例子中,`eval()`如何不是'危险'

qwe*_*ty- 3 python eval python-3.4

我正在检查一个计算器示例,在所使用的示例中eval()通常是危险的,但这是该示例的一部分;

if button == "=":
    #Check carefully how we using the 'dangerous' eval()
    total = eval(str1,{"__builtins__":None},{})
    str1 = str(total)
    print (str1)
Run Code Online (Sandbox Code Playgroud)

我检查过但我不明白; 怎么eval(str1,{"__builtins__":None},{})没危险?这{"__builtins__":None},{}显然是关于这一部分,但我不明白.

注意:str1我们正在添加数字和smybols之类的字符串4+5.然后eval()处理它.

Dun*_*nes 7

代码不是最安全的.builtins仅通过访问文字属性就可以相对容易地访问模块.

例如.

result = eval("""[klass for klass in ''.__class__.__base__.__subclasses__()
            if klass.__name__ == "BuiltinImporter"][0].load_module("builtins")""",
    {"__builtins__":None},{})
assert result is __builtins__
Run Code Online (Sandbox Code Playgroud)

细分:

  • ''.__class__.__base__ 是简写 object
  • object.__subclasses__()列出object解释器中的所有子类(包括导入机制使用的类)
  • [klass for klass in ... if klass.__name__ == "BuiltinImporter"][0]- 选择BuiltinImporter课程.
  • load_module("builtins")使用它BuiltinImporter来访问builtins模块 - 这是你试图限制访问的东西.