当我在阅读像Python一样的代码: David Goodger 的惯用Python时,我偶然发现了以下警告.
摘自文章......
Run Code Online (Sandbox Code Playgroud)print('Hello %(name)s, you have %(messages)i messages' % locals())这非常强大.这样,您可以执行所需的所有字符串格式设置,而无需担心插值值与模板的匹配.
但是权力可能是危险的."拥有权利的同时也被赋予了重大的责任." 如果将
locals()from与外部提供的模板字符串一起使用,则将 整个本地名称空间公开给调用者.这只是要记住的事情.
我试图了解使用可能是危险的具体情况locals().locals()可以理解如何利用代码中存在的任何示例.谢谢!
示例,简单代码:
script_name = 'readpw.py'
...
entered_pw = raw_input()
if entered_pw != real_pw:
print "%(script_name)s: The password you entered: "+entered_pw+" is incorrect."%locals()
Run Code Online (Sandbox Code Playgroud)
考虑enter_pw的情况 %(real_pw)s
一个简单的例子:如果你enc_key在 webapp-view 的本地命名空间中有一些神奇的、极其重要的加密密钥,你会以这种方式使用用户提供的字符串:
a_var_that_gets_display = user_supplied_string % locals()
Run Code Online (Sandbox Code Playgroud)
攻击者可以通过诸如Encryption key is %(enc_key)sas之类的东西user_supplied_string来获取你的密钥。
我承认这是一个极不可能的、虚构的例子。通常,locals()只要不使用用户提供的数据作为格式字符串,就会使用保存。
| 归档时间: |
|
| 查看次数: |
1453 次 |
| 最近记录: |