【发布时间】:2012-01-31 06:12:39
【问题描述】:
好的,我有一个应用程序,我想添加支持其他人编写应用程序将加载的模块。
这些模块将是一个扩展我的 Module 类的类,用 .Net 编写。我需要知道如何在沙盒环境中加载这些 DLL,只允许它们在某些目录中读/写。
这可能吗?
【问题讨论】:
-
您的问题引用了
scripting标签。您是否打算动态编译您的 .NET 代码或此标记如何应用于您的情况?
好的,我有一个应用程序,我想添加支持其他人编写应用程序将加载的模块。
这些模块将是一个扩展我的 Module 类的类,用 .Net 编写。我需要知道如何在沙盒环境中加载这些 DLL,只允许它们在某些目录中读/写。
这可能吗?
【问题讨论】:
scripting 标签。您是否打算动态编译您的 .NET 代码或此标记如何应用于您的情况?
是的,这是可能的。使用代码访问安全性和 .NET 沙箱。我建议你看看CSScript 库(开源)。这是一个提供 C# 脚本和动态编译成动态程序集的库。我在一个项目中使用它来允许最终用户编写 C# 脚本并执行它们,从而允许与我系统中的类进行交互。该项目要求他们无权访问 File IO 或 MessageBox (UI),因为用户脚本将在服务器上执行。 CSSCript 使用 .NET 框架的元素来限制程序集可以访问的内容,如果调用任何这些禁止的类型,您将获得异常。
所以,看看那个。一旦我找到更多关于如何它可能的细节,我将编辑我的答案,只是为了让你知道它是可能的!
好的,找到了。这是几年前我和 CSScript 的作者的一次讨论:
我:
我正在开发一个应用程序,并希望让用户能够通过 UI 编写某些操作的脚本。 CSScript 看起来非常适合这个。但是,我也希望允许用户这样做并在 Web 服务器上执行他们的脚本。现在这是一场安全噩梦,因为用户可以编写 "Directory.Delete(@"C:\", true)" 并擦除硬盘驱动器。那么是否可以限制用户可以从其脚本访问的程序集、命名空间甚至类,以便在安全沙箱中运行 CSScript?
奥列格:
立即有吸引力的解决方案是使用 .NET Sandbox。它专为此类场景而设计。CLR 标准沙盒可用于使用 CS-Script 运行脚本的主机应用程序。这个想法是在加载可疑脚本之前初始化 CAS,其余的由 CLR 负责。如果您需要配置目录/文件权限,您可以使用 CAS 工具来完成。这种方式脚本是用户提供的例程的“传输”。 CS-Script 是实现此类传输的便捷机制,但实际的安全问题由 .NET Sendoxing 解决,它具有全面的功能集,几乎涵盖了所有可能的安全场景。使用 CS 脚本可下载文件,您可以找到 Sendboxing 示例 (\Samples\Sandboxing),该示例演示了如何防止脚本执行文件 I/O 操作(例如创建文件)。
因此,我认为您需要查看 .NET Sandbox 并将程序集加载到其中。我意识到这个示例特定于 C# 脚本,但我相信它适用于您的场景,因为上面的 CSScript 示例将向您展示一种实现沙盒和安全性的方法。
可以在此处找到有关如何将程序集加载到沙箱中的一些具体示例:
在我们讨论模块加载时,您听说过Microsoft Prism 吗?这为模块加载和依赖注入(通过Unity 或MEF)提供了一个很好的框架,这在开发插件架构时可能非常有用。
最好的问候,
【讨论】: