2009-11-18 103 views
1

我正在考慮實現一個用Python語法編寫的配置文件,這與Django所做的不一樣。可能的沙箱Python配置文件?

雖然我看過onetwo SO關於在配置文件中使用可執行代碼的優點問題,我很好奇是否有辦法在「沙箱」中執行配置文件代碼以防止錯誤代碼鎖定主機應用程序。

因爲宿主應用程序是程序員的工具,所以我不擔心至少在one other SO question中提到的Python語法教學或引入安全漏洞。但我擔心配置代碼branching to Fishkill並鎖定主機應用程序。我寧願主機應用程序捕獲這些問題並顯示診斷錯誤信息。

有沒有人試過這種沙盒的Python配置文件?而且,如果是這樣,哪些技術被證明是有用的,我應該注意到哪些缺陷出現了?

+0

「因爲宿主應用程序是程序員的工具」而你不能相信他們調試自己的問題?我認爲你對他們做得太多了。你擔心什麼確切的濫用情況?他們是否會在一切機會上顛覆一切的精神病反社會人士?或者會出現語法錯誤的罕見問題? – 2009-11-18 18:42:30

+0

我可能過於保護,但如果配置文件出現問題,我確實希望發出描述性和準確的錯誤消息。我總是欣賞其他軟件中的那種細節。我仍然想知道使用Python代碼配置文件的可能性。 – yukondude 2009-11-18 21:31:50

回答

3

我們爲我們的一些內部工具

我們做什麼,從異常問題,保護我們,並阻止由用戶任何企圖得到的配置腳本過於創意做到這一點。但它不能保護我們免受無限循環或積極惡意的第三方的侵害。

這裏的方法的核心是在鎖定的exec中運行腳本。

  1. 首先,我們要經過__ __內置模塊,我們不希望他們能夠觸摸德爾一切,尤其是__ __進口。我們實際上是在一個上下文管理器中執行此操作,該管理器將原始值備份起來並在途中將其刪除,然後在返回時恢復原始值。

  2. 接下來我們創建一個空字典作爲配置腳本名稱空間。

  3. 然後我們用命名空間執行配置。

  4. 該exec當然包裹在一個嘗試,除了會捕獲任何東西。

  5. 最後我們檢查命名空間以提取我們感興趣的變量。

點這裏要注意:

  1. 這可能是很有誘惑力的預填充用的東西命名空間,可能是到配置腳本是有用的,但你要非常小心,這樣做,便可快速打開掛鉤回主機程序。

  2. 配置腳本仍然可以創建函數和類,因此您可能會找回類似字符串的東西,但實際上它是可執行代碼的任意一組。

由於這些強加給我們,我們的配置腳本預計將生產純原始數據結構(通常只是整數,字符串,列表,元組和無)的限制,我們然後分別驗證。

2

不幸的是,你可以用標準的Python來解決這個問題。當Python解釋器運行代碼可以做任何喜歡的「配置代碼」時,包括訪問主機程序或不返回控制。在單獨的進程中運行配置代碼可能會有所幫助,但也會限制主機和配置代碼之間的交互。

最好的辦法是查看PyPy項目的sandbox feature。這可能是你需要的,但也可能涉及到你的部分工作來進行整合。

Is there an alternative to rexec for Python sandboxing?也討論了這個話題。

你也許應該問問自己,這個問題實際上對你有多重要。我想這取決於你的用例以及誰將寫入配置代碼。

+0

謝謝,我的確在研究PyPy的沙盒,但是想知道這是否足以滿足我的需求。 – yukondude 2009-11-18 21:35:12