如何在Python代码中利用locals()?

8 投票
2 回答
1579 浏览
提问于 2025-04-16 15:17

我在阅读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() 是安全的。

撰写回答