2013-03-05 65 views
2

幾個月來,我開發了一個個人工具,用於在線編譯C#3.5 Xaml項目。基本上,我正在編譯CodeDom編譯器。我正在考慮將其公開,但問題在於,使用此工具在服務器上執行任何操作都非常容易。在沙箱中運行.Net應用程序

我想保護我的服務器的原因是因爲有一個「運行」按鈕來測試和調試應用程序(在屏幕截圖模式下)。

是否可以在沙箱中運行應用程序 - 換句話說,限制內存訪問,硬盤驅動器訪問和BIOS訪問 - 無需在VM中運行它?還是應該分析每個代碼,或者「禁用」運行模式?

回答

3

啓動一個AppDomain,在其中加載程序集,查找您控制的接口,激活實現類型,調用您的方法。只是不要讓任何實例跨越你不能100%控制的AppDomain屏障(包括異常!)。

爲您的外部代碼AppDomain控制安全策略對於單個答案有點多,但您可以check this link on MSDN或僅搜索「代碼訪問安全msdn」以獲取有關如何保護此域的詳細信息。

編輯:有例外,你不能停下來,所以重要的是要注意它們並以某種方式記錄導致異常的程序集,這樣你不會再加載它們。

此外,注入到此第二個AppDomain中,然後您將使用它來執行所有加載和執行。這樣可以確保沒有任何類型(不會導致整個應用程序無法使用)將跨越任何AppDomain邊界。我發現定義一個擴展MarshalByRefObject的類型非常有用,您可以調用在第二個AppDomain中執行不安全代碼的方法。它不應該返回一個非邊界類型,該類型在邊界上沒有標記爲Serializable,可以作爲方法參數或返回類型。只要你能做到這一點,你就有90%的選擇。

+0

這是針對Web應用程序還是針對任何.Net客戶端代碼? – 2013-03-05 02:59:18

+0

@LéonPelletier兩者。你可以隨時隨地創建一個AppDomain。但是,在任何應用程序(特別是瀏覽器,以及桌面)的單個響應範圍內,您無法執行此操作。所以你有(如果你想讓你的UI resopnsive)在不同的線程上做到這一點。在Web應用程序中稍微複雜一些,但可行。您只需要異步輪詢該網站,然後在完成後重定向。 – Will 2013-03-05 03:05:51

+2

+1。 @LéonPelletier - 任何.Net代碼。請注意,即使是最嚴格的CAS策略和代碼驗證也不能完全保護您 - 最簡單的方法是創建StackOverflowException,並通過一些遞歸調用來取消應用程序域/進程 - 只需要儘可能低的一組權限(執行)。 – 2013-03-05 03:09:22

相關問題