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