2011-04-07 16 views
9

當我讀大衛古德爾的Code Like a Pythonista: Idiomatic Python時,我偶然發現了下面的警告。從文章locals()如何在Python代碼中被利用?

摘錄...

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

這是非常強大的。有了這個,你可以將 做的所有字符串格式化爲你想要的 而不用擔心 匹配插值到 的模板。

但是電力可能是危險的。 「隨着巨大的權力來了很大的責任 。」如果您使用 locals()與 外部提供的模板字符串 ,則會將整個本地名稱空間 公開給調用方。要記住這只是 。

我想了解特定的場景中使用locals()可能是危險的。我們讚賞任何關於如何利用代碼中locals()的例子。謝謝!

回答

4

一個簡單的例子:如果你有一些神奇的超重要的加密密鑰enc_key在web應用程序視圖的本地命名空間,你會使用這樣一個用戶提供的字符串:

a_var_that_gets_display = user_supplied_string % locals() 

不是一個攻擊者可以通過像Encryption key is %(enc_key)s這樣的user_supplied_string並且會得到你的密鑰。

我承認這是一個極不可能的和構造的例子。只要您不使用用戶提供的數據作爲格式字符串,通常會使用locals()

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

考慮這樣entered_pw是%(real_pw)s

的情況下