C#加载沙盒装配

时间:2012-01-01 01:10:31

标签: c# .net module sandbox

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

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

这可能吗?

1 个答案:

答案 0 :(得分:9)

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

所以,看看那个。一旦我找到关于如何可能的更多细节,我会编辑我的答案,只是为了让你知道 可能!


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

我:

  

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

奥列格:

  

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

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

有关如何将程序集加载到沙箱中的一些具体示例,请参见:

虽然我们正在讨论模块加载,但您听说过Microsoft Prism吗?这为模块加载和依赖注入(通过UnityMEF)提供了一个很好的框架,这在开发插件架构时非常有用。

致以最诚挚的问候,