2011-04-06 28 views
2

SPOJ的是一個網站,列出了編程難題,然後允許用戶編寫代碼來解決這些難題,並上傳自己的源代碼服務器。服務器然後編譯該源代碼(或者解釋它是否是解釋型語言),針對代碼運行一系列單元測試,並驗證它是否正確地解決了該問題。架構到沙箱的編譯和執行不可信的源代碼

什麼來實現這樣的事情最好的辦法 - 你怎麼沙箱用戶輸入,使其不能妥協的服務器?你應該使用SELinux,chroot還是虛擬化?所有三個加上我還沒有想到的其他東西?

如何應用可靠的通信,同時也確保了結果不受損害監獄外的結果嗎?例如,如何防止應用程序將大量無意義的數據寫入磁盤或其他惡意活動?

我真正好奇,因爲這似乎只是一個非常危險的類型的應用程序來運行的。

回答

1

從一個受限用戶帳戶執行的chroot監牢聽起來就像是最好的起點(即根或運行你的web服務器相同的用戶)

爲了防止廢話龐大的數據塊寫入磁盤,您可以使用磁盤配額或單獨的卷,您不介意填滿(假設您不是在同一用戶下並行測試 - 否則最終會處理惱人的競爭條件)

如果您想要要做更具伸縮性和安全性的事情,您可以使用動態虛擬化主機與您自己的服務器/客戶端解決方案進行通信 - 您有一個「年齡池」 nts'接收指令以從X存儲庫或共享中複製和編譯,然後執行一系列測試,並通過相同的服務器/客戶端協議將輸出記錄回來。您的主機的過程可以觀看過多的磁盤使用情況和報告警告,如果需要,代理人可能會或可能不會chroot監牢下執行代碼,如果你是超級偏執狂,你會在每次運行後破壞劑和旋轉了一個新的虛擬機當下一個樣品準備好進行測試時。如果您在雲中進行大規模(例如,運行在EC2上的100多個代理商),您只有足夠的時間來滿足需求,從而降低成本。同樣,如果你打算進行擴展,你可以使用像Amazon SQS這樣的緩衝請求,或者如果你正在做一個實驗樣本項目,那麼你可以做更簡單的事情(只考慮分佈式並行處理系統,例如seti @ home)

+0

「並因此降低您的成本。」 - 考慮到降低成本,爲什麼不使用[Ideone API(http://ideone.com/api)?它已經準備好並免費供小型非商業項目使用。 – kuszi 2011-04-08 08:45:18

+0

@ŁukaszKuszner,我指的是商業部署的持續成本。一旦您的成本按每小時美元計算,開發成本變得微不足道;) – saschabeaumont 2011-04-11 00:31:16