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