Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在沙箱中运行.Net应用程序_C#_.net_Sandbox - Fatal编程技术网

C# 在沙箱中运行.Net应用程序

C# 在沙箱中运行.Net应用程序,c#,.net,sandbox,C#,.net,Sandbox,几个月来,我开发了一个用于在线编译C#3.5 Xaml项目的个人工具。基本上,我是用CodeDom编译器编译的。我正在考虑将其公开,但问题是,使用此工具在服务器上执行任何操作都非常简单 我想保护我的服务器的原因是因为有一个“运行”按钮来测试和调试应用程序(在屏幕截图模式下) 这是否可以在沙箱中运行应用程序—换句话说,限制内存访问、硬盘访问和BIOS访问—而不必在VM中运行它?或者我应该只分析每个代码,还是“禁用”运行模式?启动AppDomain,在其中加载程序集,查找您控制的接口,激活实现类型,

几个月来,我开发了一个用于在线编译C#3.5 Xaml项目的个人工具。基本上,我是用CodeDom编译器编译的。我正在考虑将其公开,但问题是,使用此工具在服务器上执行任何操作都非常简单

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


这是否可以在沙箱中运行应用程序—换句话说,限制内存访问、硬盘访问和BIOS访问—而不必在VM中运行它?或者我应该只分析每个代码,还是“禁用”运行模式?

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

控制外部代码AppDomain的安全策略对于单个答案来说有点难,但是您可以或只是搜索“代码访问安全msdn”来获取有关如何保护此域的详细信息

编辑:存在无法停止的异常,因此必须注意这些异常,并以某种方式记录导致异常的程序集,以免再次加载它们


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

这是针对web应用程序还是针对任何.Net客户端代码的?@LéonPelletier二者兼而有之。您可以随时随地启动AppDomain。但是,在任何应用程序(尤其是浏览器和桌面应用程序)中,都无法在单个响应范围内完成此操作。因此,您必须(如果您想保持UI的分辨率)在不同的线程上执行此操作。在web应用程序中稍微复杂一点,但可行。您只需异步轮询网站,然后在完成后重定向即可。+1@LéonPelletier-任何.Net代码。请注意,即使是最严格的CAS策略和代码验证也不能完全保护您-最简单的方法是使用递归调用创建StackOverflowException以拆除应用程序域/进程-只需要尽可能低的权限集(执行)。@AlexeiLevenkov肯定存在无法捕获或处理的异常。这些是很少的,但你可以随时记录它们,优雅地恢复,并避免再次加载进攻集会。当然,这在web应用程序中比在桌面上更重要。@LéonPelletier这似乎是一个沉重的负担。但是一个通过机器保证隔离的系统。在这种情况下,您只需担心对共享资源(磁盘、网络等)的访问。