2010-04-14 74 views
7

我有一个可以通过反射来加载插件的Web应用程序。它目前使用Assembly.LoadFrom()Activator.CreateInstance()完成此操作。现在,插件被加载到相同的AppDomain中,并可以访问我的应用程序中的任何内容以及我的应用程序可以访问的任何内容。限制.net插件可以访问的内容

我在寻找的是一种限制插件为安全目的可以访问的类和方法。我想让所有的类和方法在被调用时抛出异常,除非它们被列入白名单。我基本上将一个API类和几个数据传输对象中的所有函数列入白名单。

我也不希望插件能够访问它自己的文件系统或数据库。我想我可以在单独的AppDomain中使用信任级别来实现这一点。

有没有人有任何好的想法或资源?这是可以通过代码访问安全性或.net 4中新的安全透明代码功能完成的事情吗?

+0

我猜你没有一个系统管理员负责保持网站的稳定。谁添加插件?顾客? – 2010-04-15 00:13:54

+0

我们不允许客户将插件直接上传到现场。不过,我们正计划采用客户给我们的插件,并将它们自己添加到网站中。除非我拆解dll并手动检查,否则我不确定我是否完全信任它。 – 2010-04-15 00:16:56

回答

3

如果您想应用一般访问限制,则使用单独的AppDomain是正确的方法。至于限制对特定于应用程序的逻辑的访问,只是不要将“应用程序内部”服务对象的实例提供给插件对象。此外,任何不是M​​arshalByRef的引用类型对象都不会跨AppDomain边界,因此即使存在尝试返回它们的公开方法,这些对象也是安全的,无法访问。

+0

这听起来很有希望,但是阻止插件调用静态方法或创建对象的新实例的是什么?我有点担心插件可能能够获取它不应该看到的连接字符串的信息。 – 2010-04-15 00:23:58

+1

创建一个允许扩展安全集成的设计并不重要。您不能阻止对象的实例化或对静态成员的访问,但是您完全可以控制对原始AppDomain中任何实际实例的访问权限。该插件只会显示你明确使用Marshal的实例。关键是插件实例化你的类不应该允许你的应用程序状态发生变化,因为它们都不能获得对你实际应用程序状态的引用。其他间接副作用(如文件系统或操作系统访问)通过AppDomain安全设置进行控制。 – 2010-04-15 00:33:42

0

我通常更多的是一个信任的人,所以我会去一个单独的应用程序域,
但通过你的问题,我想你是有点疲惫,然后我。

如果你真的想要安全起见,我会说在一个单独的过程中加载插件,并将插件接口交给一个“进程间”桥接器,只是为了它需要的东西......

这样,您确定只会选择插件所需的内容。此外,你可以很容易地启动这个守护进程,作为一个对系统调用,文件系统和环境的访问有限的“弱”用户。