【问题标题】:C# - Get all 'usings' of an assemblyC# - 获取程序集的所有“使用”
【发布时间】:2012-08-27 01:36:53
【问题描述】:

我编写了一个插件系统,插件主机需要知道每个模块有哪些“使用”。

主要思想是限制插件可以在代码中使用的内容,以评估其安全级别。 示例:插件无法操作磁盘或网络,那么我正在考虑通过“使用”或加载的 dll 来限制。

我搜索了如何获取插件的“加载模块”,但我没有找到 System.IO 的参考或任何可以提供帮助的 dll。

然后我查看 assembly.Get***() (modules/fields/...)

也许一个例子可以帮助:插件'A' 入口点.cs

using System.Collections.Generic; <--- is allowed
using System.IO;  <--- it is not allowed
using System.Net;  <--- it is not allowed
.... Declare a namsespace, classes and other... AND i used a streamwriter

我需要知道插件是否使用 System.Net 或其他禁止引用。

感谢(非常感谢所有可能性)

编辑: 1) Assembly.GetReferencedAssemblies 不起作用,某些 DLL 具有允许和禁止引用

2) 磁盘/网络访问可以使用一些管理此访问的“帮助库”来完成。

3) 对于沙盒解决方案:我看到了这个,但主要问题是我有一个虚拟磁盘之类的东西,当用户要求列出一个目录时,这个操作会询问服务器“这个用户在这个文件中有什么文件文件夹?'然后此服务器将收集数据库中的所有文件并返回此列表。当必须读取/写入文件时,需要同步此修改。与可以读取此文件的所有其他计算机。网络操作特定于一系列“虚拟合作伙伴”,但没有完整的 VPN 解决方案。

【问题讨论】:

  • 您想弄清楚代码是否字面意思是“使用”,或者您想弄清楚程序集是否具有对特定 DLL 的引用?
  • @aquinas 可能搜索特定的 DLL(或列表)会比字面上的“每次使用”更好(更简单甚至可能)
  • 您是否想弄清楚代码是否引用了某些类型? using 子句在编译后的代码中不可见。
  • 我猜您需要使用 Mono.Cecil 加载程序集并检查所有元数据标记。 |或者你可以使用 CAS,它是为限制非特权代码的权利而设计的。
  • 您应该知道,恶意用户可以通过使用间接为他们进行这些调用的本机库来绕过您的检查。

标签: c# plugins reflection


【解决方案1】:

这是不可能的。 using 只是一个语法助手,可让您免于完全限定要从另一个命名空间使用的所有内容。

如果您想以受限权限运行一段代码,则可以通过将其加载到具有受限信任的单独应用程序域中来实现。 Here's an article that may help.

【讨论】:

  • 通过“只是一个语法助手”,这意味着 using 声明不会进入程序集。即使这样做了,您也不能使用它们来保证某人不只是使用类型的全名,因此如果您试图确保不使用某些命名空间,检查这些声明是行不通的无论如何,你有什么好处。
【解决方案2】:

Assembly.GetReferencedAssemblies 将为您提供程序集的依赖项。

【讨论】:

  • 我试过了,测试插件进行磁盘读取,它只显示 mscorlib 和 PluginInterface 库,如果 System.IO 与其他“允许的使用”在同一个 dll 中不起作用......谢谢帮助.
  • @Rafael 这是因为 System.IO(或更确切地说是相关的 IO 类)在 mscorlib 中。是时候重新评估您的方法了。
【解决方案3】:

查看System.Addins 命名空间。这使您可以在部分受信任的环境中安全地枚举和加载插件。

this SO question 的答案也可能有所帮助,尤其是强大的插件命名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2010-09-08
    相关资源
    最近更新 更多