C#加载沙盒assembly

好的,我有一个应用程序,我想添加支持其他人编写应用程序将加载的模块。

这些模块将是一个扩展我的Module类的类,用.Net编写。 我需要知道如何在沙盒环境中加载这些DLL,只允许它们在某些目录中读/写。

这可能吗?

是的,这是可能的。 使用代码访问安全性和.NET Sandbox。 我建议你看看CSScript库(开源)。 这是一个库,它提供C#脚本并动态编译为动态程序集。 我在一个项目中使用它来允许最终用户编写C#脚本并执行它们,允许与系统中的类进行交互。 该项目要求他们无法访问File IO或MessageBox(UI),因为用户脚本要在服务器上执行。 CSSCript使用.NET框架的元素来限制程序集可以访问的内容,如果调用任何这些禁止类型,您将获得exception。

所以,看一看。 一旦我发现了更多可能的细节,我会编辑我的答案,只是为了让你知道它可能的!


好的发现了。 以下是我几年前与CSScript作者的讨论:

我:

我正在开发一个应用程序,并希望公开用户通过UI编写某些操作脚本的能力。 CSScript看起来非常好用。 但是,我还希望允许用户执行此操作并在Web服务器上执行其脚本。 现在这是一个安全噩梦,因为用户可以写“Directory.Delete(@”C:\“,true)”并擦除硬盘驱动器。 那么是否可以限制用户可以从其脚本访问的程序集,命名空间甚至类,以便在安全的沙箱中运行CSScript?

奥列格:

直接有吸引力​​的解决方案是使用.NET Sandbox。 它专为此类场景而设计.CLR标准沙盒可用于运行带有CS脚本的脚本的主机应用程序。 这个想法是你在加载可疑脚本之前初始化CAS,其余的是CLR责任。 如果您需要配置目录/文件权限,则可以使用CAS工具进行配置。 这样,脚本就是用户提供的例程的“运输”。 CS-Script是实现此类传输的便捷机制,但实际的安全问题由.NET Sendoxing解决,它具有全面的function集,几乎涵盖了所有可能的安全方案。 使用CS脚本下载,您可以找到Sendboxing示例(\ Samples \ Sandboxing),它演示了如何防止脚本执行文件I / O操作(例如创建文件)

因此,我认为您需要查看.NET Sandbox并将程序集加载到其中。 我意识到这个示例特定于C#Scripting但我相信它适用于您的场景,因为上面的CSScript示例将向您展示实现沙盒和安全性的方法。

可以在此处找到有关如何将程序集加载到沙箱中的一些具体示例:

  • 在沙箱中加载.NET程序集
  • 代码访问安全性在实践中
  • 如何使用CAS约束程序集

在我们讨论模块加载时,你听说过Microsoft Prism吗? 这为模块加载和dependency injection(通过Unity或MEF )提供了一个很好的框架,这在开发插件架构时非常有用。

最好的祝福,