2013-03-05 35 views
2

几个月来,我开发了一个个人工具,用于在线编译C#3.5 Xaml项目。基本上,我正在编译CodeDom编译器。我正在考虑将其公开,但问题在于,使用此工具在服务器上执行任何操作都非常容易。在沙箱中运行.Net应用程序

我想保护我的服务器的原因是因为有一个“运行”按钮来测试和调试应用程序(在屏幕截图模式下)。

是否可以在沙箱中运行应用程序 - 换句话说,限制内存访问,硬盘驱动器访问和BIOS访问 - 无需在VM中运行它?还是应该分析每个代码,或者“禁用”运行模式?

回答

3

启动一个AppDomain,在其中加载程序集,查找您控制的接口,激活实现类型,调用您的方法。只是不要让任何实例跨越你不能100%控制的AppDomain屏障(包括异常!)。

为您的外部代码AppDomain控制安全策略对于单个答案有点多,但您可以check this link on MSDN或仅搜索“代码访问安全msdn”以获取有关如何保护此域的详细信息。

编辑:有例外,你不能停下来,所以重要的是要注意它们并以某种方式记录导致异常的程序集,这样你不会再加载它们。

此外,注入到此第二个AppDomain中,然后您将使用它来执行所有加载和执行。这样可以确保没有任何类型(不会导致整个应用程序无法使用)将跨越任何AppDomain边界。我发现定义一个扩展MarshalByRefObject的类型非常有用,您可以调用在第二个AppDomain中执行不安全代码的方法。它不应该返回一个非边界类型,该类型在边界上没有标记为Serializable,可以作为方法参数或返回类型。只要你能做到这一点,你就有90%的选择。

+0

这是针对Web应用程序还是针对任何.Net客户端代码? – 2013-03-05 02:59:18

+0

@LéonPelletier两者。你可以随时随地创建一个AppDomain。但是,在任何应用程序(特别是浏览器,以及桌面)的单个响应范围内,您无法执行此操作。所以你有(如果你想让你的UI resopnsive)在不同的线程上做到这一点。在Web应用程序中稍微复杂一些,但可行。您只需要异步轮询该网站,然后在完成后重定向。 – Will 2013-03-05 03:05:51

+2

+1。 @LéonPelletier - 任何.Net代码。请注意,即使是最严格的CAS策略和代码验证也不能完全保护您 - 最简单的方法是创建StackOverflowException,并通过一些递归调用来取消应用程序域/进程 - 只需要尽可能低的一组权限(执行)。 – 2013-03-05 03:09:22

相关问题