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

本文关键字:net 应用程序 运行 | 更新日期: 2023-09-27 18:02:07

几个月来,我开发了一个个人工具,用于在线编译c# 3.5 Xaml项目。基本上,我用CodeDom编译器编译。我正在考虑将其公开,但问题是,使用这个工具在服务器上做任何事情都非常非常容易。

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

是否有可能在沙箱中运行应用程序-换句话说,限制内存访问,硬盘访问和BIOS访问-而不必在虚拟机中运行?或者我应该分析每个代码,或者"禁用"运行模式?

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

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

控制外部代码AppDomain的安全策略对于单个答案来说有点多,但您可以在MSDN上查看此链接或只是搜索"代码访问安全MSDN"以获取有关如何保护此域的详细信息。

Edit:有些异常您无法停止,因此注意它们并以某种方式记录导致异常的程序集是很重要的,这样您就不会再次加载它们。

同样,最好将注入到第二个AppDomain中,然后使用这个类型来完成所有的加载和执行。这样就可以确保任何类型(不会使整个应用程序崩溃)都不会跨越任何AppDomain边界。我发现定义一个扩展MarshalByRefObject的类型很有用,您可以在第二个AppDomain中调用执行不安全代码的方法。无论作为方法参数还是作为返回类型,它都不应该返回未跨边界标记为Serializable的未密封类型。只要你能做到这一点,你就成功了90%。