如何在Python代码中利用locals()?
我在阅读David Goodger的《像Pythonista一样编写代码:惯用Python》时,遇到了以下警告。
文章摘录...
print('Hello %(name)s, you have %(messages)i messages' % locals())
这非常强大。借助这个,你可以随心所欲地进行字符串格式化,而不必担心将插值与模板匹配。
但强大也可能带来危险。“能力越大,责任越大。”如果你使用来自外部提供的模板字符串的
locals()
,那么你就把整个本地命名空间暴露给了调用者。这一点需要牢记。
我想理解使用locals()
可能带来危险的具体场景。如果有关于locals()
在代码中被利用的例子,那就太好了。谢谢!
2 个回答
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()
假设输入的密码是 %(real_pw)s
4
这里有个简单的例子:假设你在一个网页应用的视图中,有一个非常重要的加密密钥 enc_key
,然后你用用户提供的字符串这样做:
a_var_that_gets_display = user_supplied_string % locals()
那么攻击者可以传入类似 Encryption key is %(enc_key)s
的内容作为 user_supplied_string
,这样就能获取到你的密钥了。
我承认这个例子很不常见,也有点牵强。一般来说,只要你不把用户提供的数据当作格式字符串来用,使用 locals()
是安全的。