都是有可能發生在這種情況下,任何安全漏洞:安全Python中的eval「列表反序列化
eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})
其中unsanitized_user_input
是海峽對象。該字符串是用戶生成的,可能是令人討厭的。假設我們的web框架並沒有讓我們失望,它是一個真正的從Python內建的真正的神到str實例。
如果這樣很危險,我們可以對輸入做任何事情以保證安全嗎?
我們絕對是不要想要執行字符串中包含的任何東西。
參見:
大背景下這是(我相信)不是問題關鍵的是,我們有成千上萬的這些:
repr([unsanitized_user_input_1,
unsanitized_user_input_2,
unsanitized_user_input_3,
unsanitized_user_input_4,
...])
在某些情況下,嵌套:
repr([[unsanitized_user_input_1,
unsanitized_user_input_2],
[unsanitized_user_input_3,
unsanitized_user_input_4],
...])
其本身轉換爲字符串與repr()
,放在持久性存儲,並最終回讀與EVAL內存。
Eval從持久存儲器反序列化字符串比pickle和simplejson快得多。解釋器是Python 2.5,因此json和ast不可用。不允許使用C模塊,並且不允許使用cPickle。
「如果我提出更大的背景,這樣做的理由會更有意義。」您能否詳細說明問題?目前這個命令看起來完全沒有意義 - 與「unsanitized_user_input」無關。 – dbr 2009-07-11 02:13:49
「我們有成千上萬個」這沒有任何意義。你爲什麼要以這種方式存儲輸入? repr()用於存儲目的沒有意義。 – Miles 2009-07-11 04:58:42
你爲什麼不使用泡菜或更簡單的東西? – 2009-07-11 11:11:10