在沙盒中运行 .Net 应用程序

5
在过去的几个月里,我开发了一个个人工具,用于在线编译C# 3.5 Xaml项目。基本上,我是使用CodeDom编译器进行编译的。我正在考虑将其公开,但问题在于使用此工具可以非常容易地在服务器上进行任何操作。
我想保护我的服务器的原因是有一个“运行”按钮,可在截图模式下测试和调试应用程序。
是否可能在沙箱中运行应用程序 - 换句话说,限制内存访问、硬盘访问和BIOS访问 - 而不必在虚拟机中运行它?还是我应该分析每一行代码,或者“禁用”运行模式?
1个回答

4
创建一个AppDomain,加载程序集,查找你控制的接口,激活实现类型,调用你的方法。只是不要让任何实例跨越该AppDomain边界(包括异常!),除非你完全控制。
控制外部代码AppDomain的安全策略有点复杂,但你可以查看MSDN上的这个链接或搜索“代码访问安全性msdn”来获取有关如何保护此域的详细信息。 编辑:有些异常无法阻止,因此重要的是要注意并以某种方式记录导致异常的程序集,以便不再加载它们。
另外,最好将一个类型“注入”到第二个 AppDomain 中,然后使用该类型进行所有的加载和执行。这样可以确保任何类型都不会跨越任何 AppDomain 边界,从而避免整个应用程序崩溃。我发现定义一个扩展 MarshalByRefObject 的类型非常有用,您可以调用其中的方法,在第二个 AppDomain 中执行不安全的代码。在方法参数或返回类型中,它不应返回未标记为可序列化的未密封类型。只要能够做到这一点,就已经完成了90%的工作。

这是用于Web应用程序还是任何.Net客户端代码的? - Léon Pelletier
@LéonPelletier 两者都可以。您可以随时在任何地方启动AppDomain。但是,在任何应用程序(特别是浏览器和桌面应用程序)的单个响应时间内无法执行此操作。因此,如果您想保持UI的响应性,则必须在不同的线程上执行此操作。在Web应用程序中有点更复杂,但可行。您只需异步轮询网站,然后在完成后重定向即可。 - user1228
2
+1. @LéonPelletier - 任何 .Net 代码。请注意,即使是最严格的 CAS 策略和代码验证也不能完全保护您-最简单的方法是使用一些递归调用创建 StackOverflowException 以拆除应用程序域/进程-仅需要最低限度的权限(执行)。 - Alexei Levenkov
@AlexeiLevenkov,确实有一些无法捕获或处理的异常。这些情况很少见,但您始终可以记录它们,优雅地恢复并避免再次加载有问题的程序集。当然,在Web应用程序中比在桌面上更重要。 - user1228
由于这是一个开发平台,平均程序需要编写用户或配置数据,因此似乎最好使用虚拟机进行管理,并更加关注CPU和权限。 - Léon Pelletier
1
@LéonPelletier 看起来这是一个沉重的负担。但这确保了通过机器进行隔离。在这种情况下,您只需要担心对共享资源(磁盘、网络等)的访问。 - user1228

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接