Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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# 如何安全地运行不受信任的第三方代码?_C#_Asp.net_.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# 如何安全地运行不受信任的第三方代码?

C# 如何安全地运行不受信任的第三方代码?,c#,asp.net,.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 4,伙伴们。我正在开发一个ASP.NET MVC应用程序,如Hackerrank/Leetcode等。它提供了一组问题,用户必须在自己的机器上解决这些问题,然后提交源代码。应用程序将支持C++、java、C++和Pascal的解决方案。一切都很好,直到我意识到没有安全措施 以下是我的应用程序的工作原理: 用户向服务器提交源代码(program.cs、main.cpp等) 服务器编译代码。如果在中创建了一个可执行文件,应用程序会认为“一切正常,我们可以运行这个程序。exe/main.exe” 服务

伙伴们。我正在开发一个ASP.NET MVC应用程序,如Hackerrank/Leetcode等。它提供了一组问题,用户必须在自己的机器上解决这些问题,然后提交源代码。应用程序将支持C++、java、C++和Pascal的解决方案。一切都很好,直到我意识到没有安全措施

以下是我的应用程序的工作原理:

  • 用户向服务器提交源代码(program.cs、main.cpp等)

  • 服务器编译代码。如果在中创建了一个可执行文件,应用程序会认为“一切正常,我们可以运行这个程序。exe/main.exe”

  • 服务器运行.exe文件N次,其中N是每个问题的测试数。然后将.exe文件的输出与特定测试用例的正确输出进行比较

  • 问题是我找不到安全运行代码的方法。用户可以提交一些恶意代码。服务器将100%运行它。怎么办

    最初我是这样运行.exe的

    Process p = new Process();
    p.StartInfo.FileName = (.exe file path goes here)
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.CreateNoWindow = true;
    p.Start();
    //Send the imput, get the output
    p.WaitForExit();
    
    然后我尝试使用沙箱

    AppDomain ap = AppDomain.CreateDomain("ProgramEXE",null);
    string assemblyPath = (.exe location);
    ap.ExecuteAssembly(assemblyPath, Imput);
    AppDomain.Unload(ap);
    
    也许我必须给出一组权限,但如何做到这一点?如果程序是恶意的,如何停止它,如何在虚拟机上运行它?请给我一个提示

    例如,如果不受信任的代码如下所示:

    using System;
    using System.Threading.Tasks;
    using System.Diagnostics;
    
    namespace TurnOffPcProgram
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Code that will turn your PC off.
    
                var psi = new ProcessStartInfo("shutdown", "/s /t 0");
                psi.CreateNoWindow = true;
                psi.UseShellExecute = false;
                Process.Start(psi);
            }
        }
    }
     
    
    服务器将运行它并关闭自身(Lol)

    如果你知道如何解决这个问题,我将不胜感激。如果你有这方面的文档,请发送到这里

    我正在寻找一种方法来限制可执行文件的能力,如何对他说“不,不,你是个坏人,你想要
    System.IO.Directory.Delete(@“C:\Temp”,true);
    那不好。我不会运行你。”

    或者创造一个封闭的环境,对他说“你想做什么就做什么,你不能破坏任何东西。”


    请给我一些关于如何摆脱这个问题的提示,一些文档,一些示例,一些代码,不管你得到什么都欢迎好吧,如果你想完全控制代码的运行方式,你必须构建自己的编译器,但是,如果你只想安全地运行一段代码,那么有很多API愿意为你工作,无论是免费的还是付费的,所以你不必担心安全性和所有这些问题

    我最终使用了这个绝对惊人的API-

    优势:

  • 许多受支持的语言
  • 你不必太担心安全问题(有点)
  • 它返回有关解决方案的大量信息(标准输出、时间、内存等)
  • 弱点:

  • 没有

  • 简单的回答是——你不能(轻易地)。对用户权限的某种限制,或者沙箱,或者旋转独立的机器,可以减少爆炸半径。但是,如果你让别人的代码在你的机器上运行,那么他们可以做该帐户可以做的任何事情。可能是值得一读的。使用AWSλ是一种选择吗?作为一种选择,考虑在DOCKER容器内运行运行的解决方案。对于一个小型应用程序,每次提交解决方案时,它仍然会为构建映像带来很大的开销,因此我打赌这个解决方案不是最好的,静态分析可能会给出更好的结果。你所说的“统计分析”是什么意思?我想创建一个过滤器,它将遍历源代码并分析每个单词,如果存在诸如“Directory.Delete”或“Process.Start();”之类的可疑内容,则不要运行.exe,但这太简单了。白色或黑色的代码模式列表是不够的,您将需要沙箱方法来限制可执行文件的实际访问权限。