限制线程创建

时间:2012-05-02 20:52:19

标签: c# .net multithreading security

是否可以在C#中控制线程的某些权限(尤其是从它创建的线程)?

我正在开发一个C#应用程序,其中创建了一个新线程并执行某些用户给定的代码。

如何控制用户代码CAN和CAN不能执行的操作?这有可能吗?

特别是,我想从使用代码中限制对某些API的访问。

一个具体的例子是我想禁用从用户代码中生成新线程的能力。

*原因是用户代码可能会产生可能不能自己处理异常的新线程,从而导致整个应用程序崩溃。

3 个答案:

答案 0 :(得分:2)

没有内置的方法可以阻止在.Net中创建线程,因为创建胎面不需要任何额外的权限。

用户代码如何产生另一个线程的方式也有多种。

如果您的目标是执行恶意外部程序集,则需要保护其不仅仅是创建线程(例如,StackOverflowException非常容易抛出并在不创建新线程的情况下关闭进程)。

答案 1 :(得分:0)

为什么不试试这段代码。

Application.ThreadException + = OnHandledException;

private static void OnHandledException(object sender,ThreadExceptionEventArgs e){     //在这里处理 }

如果您关注的是未处理的异常。该片段可以解决问题。

答案 2 :(得分:0)

将应用程序与“插件”隔离的一种方法是使用单独的AppDomain来托管它。然而,这并不容易,主要是因为绝缘需要编组参考。您永远不能直接引用另一个AppDomain中的实例,因为这会破坏绝缘,因此.NET支持复杂的代理模型。这样做的缺点是,所有代码都必须以此代理编写,代理引用对象派生自MarshalByRefObject,所有非代理对象必须支持序列化以通过复制跨越远程边界。所有这些自然也会带来性能上的打击。但是,一旦完成这项工作,您现在可以允许AppDomain“崩溃”而不会关闭整个应用程序,尽管您的主应用程序仍然必须处理生成的异常(任何封送的引用调用都可能抛出RemotingException,如果引用已“死亡”。)

隔离的下一步是创建一个外部托管进程,并使用某种形式的进程间通信来与外部代码进行交互。这为您提供了出色的隔离(甚至可以防止大多数非托管代码不稳定:AppDomain中的错误非托管代码仍然可以降低整个应用程序)但是它会增加更多的复杂性和性能开销。