0

我正在使用 Microsoft.CSharp.CSharpCodeProvider 以编程方式编译程序集并从外部 .cs 文件运行一些函数。

但是有没有办法禁止这些功能对文件系统等进行任何更改(我需要在某种沙箱中运行它们)?

我正在考虑向 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)

如何添加那些没有可能严重损害系统的类(如 System.IO.File、System.IO.Directory、System.Net.(something)、System.Threading.(something)?)

或者,也许有更简单的方法?谢谢你。

4

2 回答 2

0

通过导入基本System类型,例如System.Objector System.Int32,您可以导入 mscorlib.dll 中包含的所有内容,例如System.IO.Stream. 您不能简单地将导入配置为不在程序集中包含某些类型。据我所知,您唯一的方法是构建自己的stdlib - 或构建自己的编译器,但这是另一回事。

希望感谢 Mono 项目,这应该不会太难。您可以在GitHub 上获取最新的资源。更具体地说,查看corlib 文件夹。从中删除您不希望用户使用的所有内容。最后将您的自定义添加mscorlib.dllReferencedAssemblies and 设置/nostdlib就足够了。

如果你喜欢硬核,你可以尝试使用Cecil来实现。使用这个出色的库,您可以轻松查找类型、删除它们并保存修补程序集。

另一种方法是在执行之前检查加载的程序集是否有列入黑名单的类型。这不是那么微不足道,但塞西尔可能会有所帮助。看看这个问题:.NET Reflection: Find used types

无论你选择什么,祝你好运,玩得开心:)

于 2013-06-10T23:46:26.203 回答
0

您应该为此使用代码访问安全性。虽然您不能限制程序对System.IO类型的访问而不限制其对核心类型的访问,例如System.Object,但您可以通过限制代码在运行时可以执行的操作来实现运行时沙箱。

CAS 允许您根据源自用户身份或其他来源的各种类型的证据,为不同类型的代码分配执行权限。这允许对代码可以做什么进行细粒度的调整。它可以通过命令式(即基于代码)和声明式(即基于属性)机制来控制。

CAS 是一个很大的主题,这个描述必然是简短的。

这是MonoMSDN的文档。

于 2013-08-07T19:20:56.390 回答