2012-05-12 39 views
2

我目前正在編寫一個自動源代碼驗證工具。基本上,學生必須上傳他們的C#源代碼文件作爲不同任務的解決方案。服務器在框架內編譯這些文件,並根據不同的輸入文件檢查程序。如果程序生成的輸出有效(等於預定義的輸出),則程序是有效的,並且學生獲得該程序的積分。自動編譯和運行第三方代碼

但我不認爲我可以信任學生;)可能試圖獲得文件訪問權限或在服務器上執行其他不好的事情。

我能做些什麼來限制訪問權限?
我需要考慮什麼?

已歷經想過:

  • 文件訪問
  • 最大。執行時間
  • 開始其他programms的
  • 做網絡的東西
  • 反射

目前檢查的代碼,我能想象到搜索它像「文件」,「網」關鍵字的唯一途徑, 「過程」,...使用正則表達式。

但我很確定這是非常不安全的。
有什麼建議嗎?

+2

只是爲了仔細檢查,你打算給學生打破你的沙箱A +?非常令人費解,你不會讓它成爲他們的任務。 Anyhoo,我會很樂意接受他們的簡歷。 –

+0

大多數人都是初學者,但是當他們變得更好時......如果一個學生可以打破沙盒並留下帶有信息的文本文件,他就會在服務器上打破它,一切都很好,他得到了A +,但是我不'不希望他們崩潰服務器。 – raisyn

回答

1

如果只是安全性方面,您應該在沙箱中編譯和運行程序。如果您有權訪問虛擬機,請考慮虛擬機。掃描安全漏洞的源代碼聽起來就像完成任務(坦率地說,如果學生能夠在獲得代碼正確輸出的情況下實現漏洞利用,那麼您應該考慮獎勵積分:P)

+0

這將是一個解決方案,但會帶來很多開銷,並且很難將文件導入和導出虛擬機,並在出現問題時重新啓動。 – raisyn

1

如果你願意用羅斯林CTP,你可以看看Compilify。您不需要擴展基礎架構,關鍵部分是創建沙箱。

0

學生源代碼的編譯本身不應該構成任何安全風險,但是執行學生代碼需要一個沙箱,因爲代碼是不可信的。 AppDomain可以用於此目的,並且可以分配特定的權限(例如Execution或FileIO)。請參閱MSDN上的this article。您可能需要添加一些工具來在另一個線程上執行目標代碼,以便在超時時終止它。

如果您擔心學生崩潰了程序(例如導致StackOverflowException的無限遞歸調用),那麼您將必須在單獨的主機進程中完成以上所有操作,以便與主應用程序進行通信。

更新

事實上,編譯可能會帶來一個問題,因爲MSBuild的可以通過在該凸出文件任務執行任意代碼。我認爲運行編譯器(csc.exe)不會造成問題,但是您必須自己構建命令行。