我正在使用Microsoft.CSharp.CSharpCodeProvider以编程方式编译程序集&从外部。cs文件运行一些函数。
但是是否有一种方法可以禁止这些函数对文件系统等进行任何更改(我需要在某种沙箱中运行它们)?
我正在考虑在CompilerParameters中添加"- nodhlib"选项,这样产生的程序集将无法访问System.IO.File和其他类。但我还是需要系统。对象,系统。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)
我如何添加那些不会严重损害系统的类(如system . io) ?文件,先。目录,System.Net(什么),System.Threading(什么)?
或者,也许有更简单的方法?谢谢你。
通过导入基本System
类型,如System.Object
或System.Int32
,您导入mscorlib.dll中包含的所有内容,如System.IO.Stream
。您不能简单地配置导入,使其不包括程序集中的某些类型。据我所知,你唯一的方法是构建你自己的stdlib -或者构建你自己的编译器,但那是另一回事。
希望感谢Mono项目,它不应该太困难。你可以在GitHub上获取最新的源代码。更具体地说,看一下corlib文件夹。只需删除您不希望用户使用的所有内容即可。最后,将您的自定义mscorlib.dll
添加到ReferencedAssemblies
并设置/nostdlib
应该足够了。
如果你喜欢硬核,你可以试着用Cecil来实现。使用这个奇妙的库,您可以轻松查找类型,删除它们并保存补丁程序集。
另一种方法是在执行之前检查加载的程序集是否有列入黑名单的类型。事情不是那么简单,但塞西尔也许能帮上忙。看看这个问题:.NET反射:查找使用的类型
无论你选择什么,祝你好运,玩得开心。
您应该为此使用代码访问安全性。如果不限制程序对核心类型(如System.Object
)的访问,就不能限制程序对System.IO
类型的访问,但是可以通过限制代码在运行时可以做的事情来实现运行时沙盒。
CAS允许您根据来自用户身份或其他来源的各种类型的证据,为不同类型的代码分配执行权限。这允许对代码的功能进行细粒度调优。它可以通过命令式(即基于代码的)和声明式(即基于属性的)机制来控制。
CAS是一门大学科,本文的描述必须简短。
这是Mono和MSDN的文档