2010-07-14 50 views
4

我需要存儲的源代碼用於在數據庫中的基本功能,並允許它通過一個管理界面進行修改。此代碼將以幾個數字和字符串作爲參數,並返回一個數字或None。我知道eval是邪惡的,所以我需要實現一種安全的方式來執行python的一個非常基本的子集,或者至少在一個基於python的web應用程序中,在語法上類似。我該如何去安全地執行python的一個子集?

明顯的答案是實現一個DSL,但是,我沒有這方面的經驗,我也沒有任何想法從哪裏開始,而且大量的可用資源似乎比我的頭腦要好一點。我希望也許有一些東西已經存在,這將允許我從數據庫中的字符串本質上生成一個安全的python-callable函數。該語言實際上只需要支持賦值,基本數學運算,if/else和不區分大小寫的字符串比較。任何其他功能都分紅,但我想大多數的東西可以用這一點來完成,不需要複雜的數據結構,類,函數等

如果沒有這樣的事情目前存在的,我願意考慮的創建一個的可能性,但正如我所說,我不知道如何去做這件事,任何有關這方面的建議也將受到讚賞。

回答

1

您可以使用Pyparsing來實現您的DSL,只要涉及的表達式不會太複雜(您沒有給出關於該表達式的全部細節,但意味着這些要求非常簡單)。看到examples page具體包括fourFn.pysimpleCalc.py

+0

這似乎是最好的建議,並simpleCalc支持*什麼,我需要一些*,但是我的DSL也需要支持不區分大小寫字符串比較和某種形式的if/else塊。 – Andre 2010-07-14 15:02:47

+0

沿着類似的路線,像http://waxeye.org這樣的東西可能會走得更遠,而不會讓你進入Python AST的東西。請參閱文檔中的示例。你仍然需要編寫自己的代碼才能真正執行你的迷你語言,但是這聽起來有限,因此從包中的一個計算器例子或其他類似的計算器例子中增加它聽起來並不難。 – 2010-07-14 20:18:31

1

限制Python的環境是很難做出真正的安全。

也許像lua是一個更適合你

+1

即使Guido承認,限制Python很難http://neopythonic.blogspot.com/2009/03/capabilities-for-python.html – 2010-07-14 09:30:25

0

你可以通過使用ast模塊來解析Python代碼轉換成抽象語法樹實現的Python的一個子集,然後在樹內檢查,它僅使用子集你允許的Python。這僅適用於Python 2.x,因爲Python 3已經刪除了ast模塊。

然而,即使使用這種方法,也很難創建100%安全的東西,因爲即使是最無害的代碼也可能允許用戶寫出可能炸燬應用程序的內容,例如,通過分配更多的內存,或使用所有CPU將程序放入無限循環。

+0

這個解決方案也很有趣,可以工作,我唯一的問題是使用默認的允許策略而不是默認的拒絕,就像pyparsing一樣。 – Andre 2010-07-14 15:12:33

2

PySandbox可能的幫助。我沒有測試過它,只是發現它連接到其他地方。

相關問題