2011-03-21 64 views
5

我正在構建一個基於Web的界面,人們可以輸入簡單的C代碼來解決算法編程問題。我使用Ace編輯器,人們可以輸入代碼,當按下運行按鈕時,C代碼被髮送到服務器,編譯並輸出回發送。組織編程競賽 - 如何編譯並執行

如何以安全的方式完成第二部分。我的意思是給一個C代碼文件,編譯並執行它。我不能相信代碼,所以我如何確保它不是惡意的,不會傷害我的系統。還有如何施加記憶和時間限制。

是否有任何已有的系統開源系統可用,我可以根據自己的需要進行修改?我在搜索中沒有找到任何東西。或者關於我應該如何繼續下一步的一些指示?

編輯:發現http://cs.sru.edu/~contest/rocktest/,並試圖瞭解他們的代碼,但仍在尋找更好的選擇,最好是在PHP

+0

的可能重複的[分級計劃 - 編譯/內執行的C++代碼C++](http://stackoverflow.com/questions/5131085/grading-program-compile-executing-c-code-within-c) – 2011-03-21 01:40:23

+1

是否http://ideone.com/太簡單了? – Johnsyweb 2011-03-21 01:42:28

+1

查看[codepad.org](http://codepad.org/)的[關於頁面](http://codepad.org/about)。即:「策略是在ptrace下運行所有​​的東西,許多系統調用都被禁止或忽略。編譯器和最終的可執行文件都在chroot jail中執行,並且資源限制嚴格。」 – 2011-03-21 01:56:56

回答

1

我建議Ideaone API:http://ideone.com/api

+0

只需添加以回答爲基礎,直至現在我的研究結果:Ideone提供了一個免費的soap api,您可以使用C語言等多種語言提交代碼,並返回輸出或錯誤。他們也給予記憶和時間使用。 – itsfrosty 2011-03-21 12:22:37

1

你必須在sandboxed environment來執行代碼。 SO上有一個similar question可能有幫助。

你也可以運行一些虛擬機來執行代碼,但這基本上是一個沙盒的例子 - 只是有點沉重。

+0

Coudl你會詳細介紹如何在正常的chroot/sysjail程序(這不是一個完整的解決方案)之外創建一個沙箱 – Earlz 2011-03-21 01:57:18

0

在沙箱 - 虛擬機中運行代碼。

除此之外,我將刪除對任何系統調用的訪問,並只允許調用標準C庫。另外,用你自己的調用來替換任何不安全的庫調用,這些調用會檢查輸入並將安全輸入委託給實際函數(特別是對於malloc,您希望每個程序可以分配多少上限)。

如果你這樣做,只需要一個虛擬機就足夠每個人的代碼。

+0

因此,基本上使用openvz或用戶模式的linux來限制用戶到他自己的環境。第二部分是用我自己的方式取代不安全的圖書館電話 - 對現有解決方案有何看法? – itsfrosty 2011-03-21 01:49:09

+0

@itsfrosty:整個現有解決方案「用您自己的替換C頭」?不,但是如果使用C語法分析庫(可以在eclipse SDK中找到)很容易實現。 – CromTheDestroyer 2011-03-21 13:04:21

2

允許我插入AppArmor,這是一種簡單的強制訪問控制機制,可以使創建這些類型的沙箱變得簡單。這裏是一個配置文件我在的地方,限制我的xpdf PDF查看器:

#include <tunables/global> 

/usr/bin/xpdf { 
    #include <abstractions/base> 
    #include <abstractions/bash> 
    #include <abstractions/X> 
    #include <abstractions/fonts> 

    /dev/tty rw, 
    owner /dev/pts/* rw, 
    /etc/papersize r, 
    /etc/xpdf/* r, 
    /bin/bash ix, 
    /usr/bin/xpdf r, 
    /usr/bin/xpdf.bin rmix, 
    /usr/share/xpdf/** r, 
    /usr/share/icons/** r, 
    owner /**.pdf r, 
    owner /tmp/* rw, 
} 

你可以學習在半天左右圍您所選擇的應用程序的基礎知識,並在另一半爲你的服務器寫入的配置文件天。 (xpdf配置文件花了我大約四分鐘的時間寫下來,但我知道我在做什麼。我們已經在一個下午的時間裏將AppArmor部署到了領先的在線零售商的面向公衆的服務器上,與其他部署的結果相似。)

AppArmor中也給出an easy interface for configuring run-time limits,諸如處理多少內存允許分配:

rlimit as <= 100M, # limit address space to 100 megabytes 

AppArmor配置將是最容易在Ubuntu,openSUSE的,SLES,PLD,Mandriva的,Pardis,或Annvix分佈使用,因爲這些工具是預先安裝的。但AppArmor的核心功能是有貨的Linux內核2.6.36和更新版本,以及it is possible to install AppArmor on any Linux distribution

其他類似工具包括SElinux,TOMOYOSMACK。我認爲SMACK是下一個最容易部署的,但其中任何一個都可以防止惡意代碼破壞您的系統。

+0

適用於AppArmor的+1以及迄今爲止最強大的解決方案 – 2011-03-21 04:30:05

0

我將使用uevalrun

「的基本用例uevalrun是提交的編程競賽的參賽者解決方案的評價:uevalrun編譯解決方案,用測試輸入運行它,將其輸出與預期輸出進行比較,並寫出狀態報告。「