2008-08-26 101 views
3

我正在尋找一個「安全」eval函數,以實現類似電子表格的計算(使用numpy/scipy)。「safe_eval」是否真的安全?

自從2.3版本以來,由於顯然不可修復的安全問題,此功能(rexec module)已從Python中刪除。有幾個第三方攻擊者聲稱要這樣做 - 我發現的最深思熟慮的解決方案是 this Python Cookbok recipe,「safe_eval」。

我是否合理安全,如果我使用這個(或類似的東西),以防止惡意代碼,或者我堅持寫我自己的解析器?有誰知道任何更好的選擇?

編輯:我剛剛發現RestrictedPython,這是Zope的一部分。對此的任何意見都是受歡迎的。

+0

您可以使用Resolver One在電子表格中使用scipy/numpy。 http://www.resolversystems.com/ – 2009-07-25 15:32:25

回答

1

取決於你的安全,我想定義。很多安全性取決於你傳入的內容以及你在上下文中允許傳遞的內容。例如,如果一個文件被傳遞,我可以打開任意文件:

>>> names['f'] = open('foo', 'w+') 
>>> safe_eval.safe_eval("baz = type(f)('baz', 'w+')", names) 
>>> names['baz'] 
<open file 'baz', mode 'w+' at 0x413da0> 

此外,環境受到很大限制(你不能在模塊通過),因此,不能簡單地通過一個模塊中像re或random的實用功能。

在另一方面,你不需要編寫自己的解析器,你可以只寫自己的評估爲蟒蛇AST:

>>> import compiler 
>>> ast = compiler.parse("print 'Hello world!'") 

這樣,希望你可以實現安全的進口。另一個想法是使用Jython或IronPython並利用Java/.Net沙箱功能。

2

編寫自己的解析器可能很有趣!這可能是更好的選擇,因爲人們在輸入公式時希望使用熟悉的電子表格語法(Excel等),而不是Python。我對safe_eval並不熟悉,但我會想像這樣的事情肯定會有剝削的可能性。

1

雖然這段代碼看起來相當安全,但我始終認爲任何有足夠動機的人在給定足夠時間的情況下可能會破壞它。我認爲這需要相當多的決心,但我相對確定它可以完成。

0

Daniel, Jinja實現了一個對您可能有用或不可用的沙箱環境。從我記憶中,它還沒有「理解」列表理解。

Sanbox info

1

如果你只需要簡單地寫下來,並在閱讀一些Python數據結構,並且不需要執行自定義代碼的實際能力,這是一個更好的貼合: http://code.activestate.com/recipes/364469-safe-eval/

它garantees無碼被執行,只評估靜態數據結構:字符串,列表,元組,字典。

0

你想要的是在編譯語言服務,請參閱 http://docs.python.org/library/language.html 如果您的應用定義爲只接受表達式,你可以編譯輸入作爲一個表達式,得到一個異常,如果它不是功能,例如如果有分號或聲明表單。