我想加载一个包含一个实现接口的类的程序集。 接口只有一个方法:“Run()”。
我想在完全受限制的AppDomain中加载该类,并阻止该实例进行文件或注册表访问。
这是我的布局:
这是我用来加载外部库,创建实例和执行接口方法的代码:
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实现了接口,但正在访问我的文件系统或更改注册表等
关于如何实现这一目标的任何想法?
答案 0 :(得分:3)
您可以从PermissionSet
删除permissions,例如:
permSet.RemovePermission(typeof(FileIOPermission));
permSet.RemovePermission(typeof(RegistryPermission));
或者您可以创建一个没有权限的PermissionSet
,然后按照here概述添加您想要的权限:
PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));