2012-02-17 60 views
2

我希望我的用戶編寫代碼並在受控環境中運行它,例如Lua或Perl。我的網站運行在Perl CGI上。 有沒有辦法在不訪問文件系統的情況下運行一個獨立的perl/Lua/python/etc腳本,並通過stdout返回數據以保存在數據庫中? 我需要的是一個安全的環境,我如何應用限制?提前致謝。 僅供參考:我想實現類似ideone.com或codepad.org的東西如何運行只能寫入STDOUT並從STDIN讀取的腳本?

我一直在閱讀有關沙箱的Lua或內聯代碼,但他們不允許我限制資源和時間,只是操作。我想我會有一臺虛擬機並在那裏運行代碼,有什麼提示?

+0

這是可能的(請參閱谷歌appengine作爲一個正常運行的系統的例子),但老實說,它有點超出了我,你會如何實現它。 – michaelfilms 2012-02-17 03:29:31

回答

3

我想到的一個想法是爲每個用戶創建一個chroot化的env,並在該chroot化的env中運行用戶的腳本。

+0

但是,如果我chroot像perl腳本,是不是有權訪問編譯器/解釋器有什麼? – AlfredoVR 2012-02-17 21:17:14

+0

如果您chroot到一個目錄並在該chroot中執行perl腳本,則該腳本將無法訪問整個文件系統。它只能訪問該chroot中的文件系統。如果你想允許訪問chroot外部的一些文件,你可以在chroot中掛載這些目錄。請閱讀chroot上的[link] {http://en.wikipedia.org/wiki/Chroot}。 – kbsbng 2012-02-18 08:32:52

1

如果你打算使用Lua中,看看在Lua的用戶維基此頁:

Sandboxes

0

由於jpjacobs在Lua說,你可以通過創建一個沙箱創建保存環境。在Lua中執行此操作的一種方法是覆蓋標準的不安全函數並調用您自己的函數。

檢查這個例子:

function safeIORead() 
    --do the processing 
end 

io.read = safeIORead 

這樣,每次該函數io.read被調用時將指向你的函數,而不是標準的Lua功能。 這只是一個如何在Lua中使用沙箱的例子。

0

對於Perl,您可能想要使用Safe模塊。正如Joqus提到的那樣,您可以提供您自己控制的輸入/輸出功能。這不是爲了膽小鬼。如果您不確定自己在做什麼,請不要將此類內容暴露給互聯網。

0

好了Lua的模塊,只要把關鍵模塊零:

io = nil 
require = nil 
dofile = nil 
-- etc ... 

這樣,你就可以毫無問題地運行的Lua腳本,此外我認爲你可以使用加載鏈功能和setfenv所以以便爲用戶的代碼定義自己的環境。

+0

代碼是做什麼或意思? – AlfredoVR 2012-02-17 20:50:15

+0

通過這樣做,你把函數或表放到** nil **,然後用戶不能調用它/使用它,如果他這樣做,它會引發一個你可以用pcall()函數處理的錯誤。 – Faylixe 2012-02-17 20:54:01

相關問題