Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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
Java 沙箱线程,捕获堆栈溢出错误_Java_Thread Safety_Sandbox_Code Injection_Stack Overflow - Fatal编程技术网

Java 沙箱线程,捕获堆栈溢出错误

Java 沙箱线程,捕获堆栈溢出错误,java,thread-safety,sandbox,code-injection,stack-overflow,Java,Thread Safety,Sandbox,Code Injection,Stack Overflow,我想对一个应用程序进行沙箱处理,最终用户可以将Java代码提交到服务器,在服务器上编译和执行Java代码(类似于作为教育游戏一部分的基于web的IDE)。通过使用标准安全管理器或使用ASM或类似工具对照白名单验证使用的API,可以轻松处理大多数方面 一个悬而未决的问题是如何处理无限循环。由于线程有自己的堆栈,StackOverflowerErrors似乎是线程本地的。我做了一个小动作,得出了以下结论: public class TryToSurviveAStackOverflow { publ

我想对一个应用程序进行沙箱处理,最终用户可以将Java代码提交到服务器,在服务器上编译和执行Java代码(类似于作为教育游戏一部分的基于web的IDE)。通过使用标准安全管理器或使用ASM或类似工具对照白名单验证使用的API,可以轻松处理大多数方面

一个悬而未决的问题是如何处理无限循环。由于线程有自己的堆栈,StackOverflowerErrors似乎是线程本地的。我做了一个小动作,得出了以下结论:

public class TryToSurviveAStackOverflow {

public static void main(String[] args) throws Exception {

    final Runnable infiniteLoop = new Runnable() {
        @Override public void run() {
            run();
        }
    };

    Runnable sandboxed = new Runnable() {
            @Override public void run() {
                try {
                    Thread.sleep(10000); // some time to connect VisualVM to monitor this
                    infiniteLoop.run();
                }
                catch (StackOverflowError x) {
                    System.err.println("Thread crashed with stack overflow");
                } catch (InterruptedException e) {
                    System.err.println("Thread interruped");
                }
            }
        };

        Thread thread = new Thread(sandboxed,"infinite loop");
        thread.start();
        thread.join();
        System.out.println(thread.getState());

        System.out.println("I am still alive");

}
}

这似乎有效,但这有多安全?特别是,不安全线程使用的堆栈空间会发生什么变化?我可以看到线程的状态设置为TERMINATED

非常感谢您的帮助/指点


干杯,Jens

我认为您应该在主机操作系统上使用运行沙盒用户进程,而不是用Java来管理所有进程。然后,您可以限制每个用户id的RAM、CPU和线程数。只需将进程的std out和std err路由给用户。我可能已经找到了答案:“当发生任何异常时,虚拟机会在堆栈中搜索活动异常处理程序(兼容的捕获块),在进程中展开堆栈。当在main()方法中找到异常处理程序时,堆栈已几乎为空(除了一些VM引导方法外,堆栈上只有main方法);所有go()调用都已删除。“-因此这似乎可以正常工作