几个月来,我开发了一个个人工具,用于在线编译 C# 3.5 Xaml 项目。基本上,我正在使用 CodeDom 编译器进行编译。我正在考虑将其公开,但问题是使用此工具在服务器上做任何事情都非常非常容易。
我想保护我的服务器的原因是因为有一个“运行”按钮来测试和调试应用程序(在屏幕截图模式下)。
这是否可以在沙盒中运行应用程序 - 换句话说,限制内存访问、硬盘驱动器访问和 BIOS 访问 - 而无需在 VM 中运行它?或者我应该只分析每个代码,还是“禁用”运行模式?
启动 AppDomain,在其中加载程序集,查找您控制的接口,激活实现类型,调用您的方法。只是不要让任何实例跨越您无法 100% 控制的 AppDomain 障碍(包括异常!)。
控制您的外部代码 AppDomain 的安全策略对于一个单一的答案来说有点多,但您可以在 MSDN 上查看此链接,或者只需搜索“代码访问安全 msdn”以获取有关如何保护此域的详细信息。
编辑:有些异常是您无法停止的,因此重要的是要注意它们并以某种方式记录导致异常的程序集,这样您就不会再次加载它们。
此外,最好将一个类型注入到第二个 AppDomain 中,然后您将使用该类型进行所有加载和执行。这样您就可以确保没有任何类型(不会降低您的整个应用程序)会跨越任何 AppDomain 边界。我发现定义一个扩展 MarshalByRefObject 的类型很有用,您可以在该类型上调用在第二个 AppDomain 中执行不安全代码的方法。它永远不应返回未标记为跨边界可序列化的未密封类型,无论是作为方法参数还是作为返回类型。只要你能做到这一点,你就成功了 90%。