【发布时间】:2012-01-28 11:35:21
【问题描述】:
我已经设置了一个小例子,我在没有任何权限的情况下将程序集加载到新的 AppDomain 中。这工作正常,程序集无法访问文件系统,也无法侦听套接字。
但我还想阻止另一件事:创建线程。为什么?因为从理论上讲,这个程序集可以创建一个线程,从而创建更多线程并淹没我的记忆。
我想到了(在我看来)最好的方法:限制 AppDomain 的内存。这可能吗?如果没有,我该怎么做才能避免创建线程?
使用此代码创建线程
Thread t = new Thread(this.DoWork);
t.Start();
AppDomain 的代码
PermissionSet set = new PermissionSet(PermissionState.None);
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read |
FileIOPermissionAccess.PathDiscovery,
this.path));
AppDomainSetup info = new AppDomainSetup { ApplicationBase = this.path };
this.domain = AppDomain.CreateDomain("Sandbox", null, info, set, null);
(好的,我允许访问我要加载程序集的文件夹中的文件系统,这只是因为 StrongName fullTrustAssembly = typeof(SecureInstance).Assembly.Evidence.GetHostEvidence<StrongName>(); 也不适合我。
希望 s/o 可以提供帮助。 (:
【问题讨论】:
-
你不可能这样做AFAIK :) 你唯一能做的就是设置线程池中的线程限制
-
AFAIK 每个 AppDomain 需要创建至少一个线程 - 否则它无法运行......所以禁用线程创建将意味着它根本无法运行恕我直言。你想达到什么目的?
-
@Elastep 感谢您的回答,但这安全吗?我认为可以在任何软件上扩展线程限制。整件事给 Java 带来了很大的好处。在 Java 中,在创建线程之前会询问 SecurityManager。
-
@Yahia 好吧,我想禁止在外国人代码中创建线程。当然需要一个线程,但不可能通过简单地创建大量线程来淹没我的记忆。
-
@PhilippSpieß 你没有回答我的问题......你想达到什么目的?您是否正在尝试构建沙箱?您是否试图以不会造成任何伤害的方式集成“外部/外部”代码?
标签: c# multithreading permissions