2013-06-05 134 views
0

我正在使用Microsoft.CSharp.CSharpCodeProvider以編程方式編譯程序集&從外部.cs文件運行某些功能。編譯單聲道和-nostdlib

但是有沒有辦法禁止這些函數對文件系統進行任何更改等(我需要在某種類型的沙箱中運行它們)?

我正在考慮在CompilerParameters中添加「-nostdlib」選項,因此生成的程序集將無法訪問System.IO.File和其他類。但我仍然需要System.Object的,System.ValueType等

現在我得到這些錯誤:

error CS0518: The predefined type `System.Object' is not defined or imported 
error CS0518: The predefined type `System.ValueType' is not defined or imported 
error CS0518: The predefined type `System.Attribute' is not defined or imported 
error CS0518: The predefined type `System.Int32' is not defined or imported 
... (too many of them) 

我如何添加這些類,而那些會嚴重損害系統(如系統.IO.File,System.IO.Directory,System.Net。(something),System.Threading。(something)?)

或者,也許有更簡單的方法?謝謝。

回答

0

通過導入基礎System類型,如System.ObjectSystem.Int32導入一起在mscorlib.dll包含如System.IO.Stream一切。你不能簡單地配置導入不包括在組裝某些類型。據我所知,你唯一的方法就是建立你自己的stdlib - 或者建立你自己的編譯器,但那是另一回事。

希望得益於Mono項目應該不會太困難。你可以拉GitHub最新的來源。更具體地講,看看the corlib folder。從這個簡單的刪除你不想讓你的用戶使用的一切。 最後加入您的自定義mscorlib.dllReferencedAssemblies和設置/nostdlib應該夠了。

如果你喜歡硬核,你可以嘗試使用Cecil來達到目的。使用這個美妙的庫,您可以輕鬆查找類型,刪除它們並保存修補程序集。

另一種解決方法是在執行之前檢查加載的程序集是否列入黑名單。這不是微不足道的,但塞西爾可能會幫助。看看這個問題:.NET Reflection: Find used types

無論你選擇,運氣好,玩得開心:)

0

,您應該使用代碼訪問安全性這一點。雖然您不能限制程序訪問System.IO類型,也不會限制其訪問核心類型(如System.Object),但可以通過限制代碼在運行時可以執行的操作來實現沙箱。

CAS允許您根據從用戶身份或其他來源導出的各種類型的證據爲不同類型的代碼執行分配權限。這允許對代碼可以執行的任何細節進行調整。它可以通過命令性的(即基於代碼)和聲明性的(即基於屬性的)機制來控制。

CAS是一個大課題,這說明必然是短暫的。

這裏是Mono的和MSDN「爲它的文檔。