【问题标题】:Prevent thread creation in AppDomain防止在 AppDomain 中创建线程
【发布时间】: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


【解决方案1】:

似乎没有简单的答案。您可以做的是使用 .NET Profiling API 来尝试监控 AppDomain 中的内存使用情况。你可以在这里找到更多关于它的信息,但你需要做一些挖掘:http://msdn.microsoft.com/en-us/library/bb384493.aspx

无论如何,在具有较低优先级的单独进程中运行您想要运行的任何内容不是更好吗,因此,如果它与内存分配一起疯狂,它不会影响您的进程,操作系统会杀死它并且它不会影响你的主进程?

【讨论】:

  • 进程级隔离的问题是多个进程的开销。由于托管 AppDomain 无法安全地中止线程,因此我必须确保无法创建它们。如果无法做到这一点,那么我可能不得不监视“违规行为”并终止整个过程。更容易但性能更差的是每次都悲观地杀死进程。但这会损害每个表现良好的人的表现。
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 2015-09-20
  • 2017-11-09
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多