我想加载一个程序集,其中包含一个实现接口(interface)的类。 该接口(interface)只有一个方法:“Run()”。
我想在完全受限的 AppDomain 中加载该类,并阻止该实例访问文件或注册表。
这是我的布局:
- 已签名的主项目 - 加载程序集、创建实例并执行方法 Run()
- 签名 C# 库 - 仅包含 IProvider 接口(interface)定义
- 外部 C# 库 - 在 MyProvider 类中实现我的接口(interface)
这是我用来加载外部库、创建实例并执行接口(interface)方法的代码:
Evidence ev = new Evidence();
ev.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet permSet = SecurityManager.GetStandardSandbox(ev);
StrongName fullTrustAssembly = typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>();
AppDomainSetup adSetup = new AppDomainSetup()
{
ApplicationBase = Path.GetFullPath(Environment.CurrentDirectory)
};
AppDomain newDomain = AppDomain.CreateDomain("Sandbox", ev, adSetup, permSet, fullTrustAssembly);
Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes("ExternalLib.dll"));
var instance = asm.CreateInstance("ExternalLib.MyProvider", true);
IProvider provider = instance as IProvider;
//Should not work, because my Assembly is accessing a file/Registry or something else
string result = provider.Run("Test");
我希望最后一行抛出异常,因为ExternalLib.dll实现了该接口(interface),但正在访问我的文件系统或更改注册表等
关于如何实现这一目标有什么想法吗?
最佳答案
您可以删除permissions来自 PermissionSet
,例如:
permSet.RemovePermission(typeof(FileIOPermission));
permSet.RemovePermission(typeof(RegistryPermission));
或者您可以创建一个没有权限的PermissionSet
,然后添加您想要的权限,如here所述。 :
PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
关于C# 防止 AppDomain 程序集的类实例进行文件访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26287195/