【问题标题】:Limiting what a .net plugin can access限制 .net 插件可以访问的内容
【发布时间】:2010-04-14 23:33:19
【问题描述】:

我有一个可以通过反射加载插件的网络应用程序。它目前使用Assembly.LoadFrom()Activator.CreateInstance() 来完成这项工作。现在插件被加载到同一个 AppDomain 中,并且可以访问我的应用程序中的任何内容以及我的应用程序可以访问的任何内容。

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

我也不希望插件能够自行访问文件系统或数据库。不过,我认为我可以在单独的 AppDomain 中使用信任级别来做到这一点。

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

【问题讨论】:

  • 我猜您没有负责保持​​网站稳定的系统管理员。谁添加插件?客户?
  • 我们不允许客户将插件直接上传到实时站点。但是,我们计划采用客户提供给我们的插件并自己将它们添加到网站中。除非我反汇编 dll 并手动检查它,否则我不确定我会 100% 信任它。

标签: c# security plugins


【解决方案1】:

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

【讨论】:

  • 这听起来很有希望,但是是什么阻止了插件调用静态方法或创建新的对象实例?我有点担心插件可能会获取它不应该看到的信息,例如连接字符串。
  • 创建允许安全集成扩展的设计并非易事。您无法阻止对象的实例化或对静态成员的访问,但您可以完全控制对原始 AppDomain 中任何实际实例的访问。该插件只会获取您明确编组的实例。关键是实例化您的类的插件不应该允许您的应用程序状态发生变化,因为它们都无法获得对您真实应用程序状态的引用。其他间接副作用(如文件系统或操作系统访问)通过 AppDomain 安全设置进行控制。
【解决方案2】:

我通常比较信任人,所以我会选择一个单独的应用程序域,
但根据你的问题,我猜你比我更累。

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

这样,您可以确定您只选择加入您希望插件公开的内容。

此外,您可以作为对系统调用、文件系统和环境的访问受限的“弱”用户轻松启动此守护进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2020-01-04
    • 2012-10-10
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多