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

时间:2011-04-07 18:17:25

标签: python namespaces

当我在David Goodger阅读Code Like a Pythonista: Idiomatic Python时,我偶然发现了以下警告。

  

摘自文章......

print('Hello %(name)s, you have %(messages)i messages' % locals())
     

这非常强大。有了这个,你   可以做你所有的字符串格式化   想要而不必担心   匹配插值来   模板。

     

但是权力可能很危险。 "强大的力量变得伟大   。责任"如果你使用   locals()来自。{   外部提供的模板字符串,   您公开整个本地命名空间   给来电者。这只是一件事   请记住。

我正在尝试了解特定方案,其中使用locals()可能很危险。可以理解如何利用代码中locals()的存在的任何示例。谢谢!

2 个答案:

答案 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()