【发布时间】: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