簡體   English   中英

如何運行只能寫入STDOUT並從STDIN讀取的腳本?

[英]How to run a script that can only write to STDOUT and read from STDIN?

我希望我的用戶編寫代碼並在受控環境(例如Lua或Perl)中運行它。 我的網站在Perl CGI上運行。 有沒有一種方法可以運行隔離的perl / Lua / python / etc腳本而不訪問文件系統,並通過stdout返回數據以保存在數據庫中? 我需要的是一個安全的環境,如何應用限制? 提前致謝。 僅供參考:我想實現ideone.com或codepad.org之類的東西

我一直在閱讀有關Lua或內聯代碼中的沙箱的信息,但它們不允許我限制資源和時間,而只能限制操作。 我想我會有一個虛擬機並在其中運行代碼,有什么提示嗎?

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

如果您打算使用Lua,請查看Lua用戶Wiki上的以下頁面:

沙箱

正如jpjacobs在Lua中所說,您可以通過創建沙箱來創建保存環境。 在Lua中執行此操作的一種方法是覆蓋標准的不安全函數,然后調用您自己的函數。

檢查以下示例:

function safeIORead()
    --do the processing
end

io.read = safeIORead

這樣,每次調用函數io.read都會指向您的函數,而不是標准的Lua函數。 這只是如何在Lua中使用沙箱的示例。

對於Perl,您可能想要使用安全模塊。 正如Joqus所提到的,您將提供自己的輸入/輸出功能,這些功能由您控制。 不過這不是為膽小的人准備的。 如果您不確定自己在做什么,請不要將此類內容暴露給互聯網。

好吧,對於Lua模塊,只需將關鍵模塊設置為nil即可:

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

這樣,您可以毫無問題地運行Lua腳本,我還認為您可以使用loadstring函數和setfenv來為用戶代碼定義自己的環境。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM