繁体   English   中英

C#阻止AppDomain程序集的类实例进行文件访问

[英]C# Prevent class instance of AppDomain assembly from file access

我想加载一个程序集,其中包含一个实现接口的类。 该接口只有一个方法:“ Run()”。

我想在完全受限的AppDomain中加载该类,并阻止实例从文件或注册表访问。

这是我的布局:

  • 已签名的主项目-加载程序集,创建一个实例并执行方法Run()
  • 签名的C#库-仅包含IProvider接口定义
  • 外部C#库-在类MyProvider中实现我的接口

这是我用于加载外部库,创建实例并执行接口方法的代码:

        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实现了接口,但是正在访问我的文件系统或更改注册表等

关于如何做到这一点的任何想法?

您可以删除的权限PermissionSet ,如:

permSet.RemovePermission(typeof(FileIOPermission));
permSet.RemovePermission(typeof(RegistryPermission));

或者你可以创建一个PermissionSet ,没有权限,然后添加你想要的,如概述在这里

PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM