gpt4 book ai didi

C# 防止 AppDomain 程序集的类实例访问文件

转载 作者:行者123 更新时间:2023-11-30 20:46:56 24 4
gpt4 key购买 nike

我想加载一个程序集,其中包含一个实现接口(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com