2013-06-05 81 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“为它的文档。