当我在David Goodger阅读Code Like a Pythonista: Idiomatic Python时,我偶然发现了以下警告。
摘自文章......
print('Hello %(name)s, you have %(messages)i messages' % locals())
这非常强大。有了这个,你 可以做你所有的字符串格式化 想要而不必担心 匹配插值来 模板。
但是权力可能很危险。 "强大的力量变得伟大 。责任"如果你使用
locals()
来自。{ 外部提供的模板字符串, 您公开整个本地命名空间 给来电者。这只是一件事 请记住。
我正在尝试了解特定方案,其中使用locals()
可能很危险。可以理解如何利用代码中locals()
的存在的任何示例。谢谢!
答案 0 :(得分:6)
示例,简单代码:
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()
考虑enter_pw为%(real_pw)s
答案 1 :(得分:4)
一个简单的例子:如果你在webapp-view的本地命名空间中有一些神奇的超重要加密密钥enc_key
,你就会以这种方式使用用户提供的字符串:
a_var_that_gets_display = user_supplied_string % locals()
攻击者可以将Encryption key is %(enc_key)s
之类的内容传递给user_supplied_string
并获取您的密钥。
我承认这是一个非常不可能和构建的例子。通常只要不使用用户提供的数据作为格式字符串,就会保存locals()
。