Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Security - Fatal编程技术网

Java 如果花费的时间太长,则停止不受信任的代码

Java 如果花费的时间太长,则停止不受信任的代码,java,multithreading,security,Java,Multithreading,Security,我目前正在开发一个程序来运行用户从外部提供的代码(假设这种情况是合理的)。经过大量研究,我发现与此相关的大部分安全性都可以由SecurityManager处理;然而,我正在努力寻找一种方法来杀死外部代码,如果它花费的时间太长并且打算恶意。例如,如果外部代码看起来像: while (true) { try { Thread.sleep(50); } catch (InterruptedException e) { // Oh well, keep r

我目前正在开发一个程序来运行用户从外部提供的代码(假设这种情况是合理的)。经过大量研究,我发现与此相关的大部分安全性都可以由SecurityManager处理;然而,我正在努力寻找一种方法来杀死外部代码,如果它花费的时间太长并且打算恶意。例如,如果外部代码看起来像:

while (true) {
    try {
        Thread.sleep(50);
    } catch (InterruptedException e) {
        // Oh well, keep running
    }
}

这将永远运行,
Thread.interrupt()
不会停止线程。有没有其他方法可以阻止不会导致任何问题的恶意线程?我所遇到的只是
Thread.stop()
,但是它似乎不是一个选项,它似乎伴随着所有的问题。如果没有,是否有其他选项可用于以程序仍能直接与其接口的方式运行此代码?

只需终止执行代码的java进程即可

假设是GNU/Linux或macOS系统:

ps -ax | grep java # identify the correct process
kill $pid          # kill it
您可以通过访问运行时在Java中执行此操作:

Process p = Runtime.getRuntime().exec(new String[]{"bash","-c","cmd 1 goes here"});
编辑:

考虑到您还必须编译用户提供的代码,编译它并在它自己的jvm中启动它是有意义的


此外,在完全虚拟的机器中执行代码是理想的,因为这样代码就被沙盒化了,无法访问主机。

我认为Java中没有办法只杀死您描述的线程。如果线程正在执行,它只是设置了一个标志,由线程来注意它,或者中断线程等待,或者在睡眠模式下抛出 中断异常

唯一的方法是终止线程运行的进程

 call System.exit(int)

这个问题毫无意义。如果用户可以运行恶意代码(根本),那么就没有安全的等待时间来尝试并杀死它。小程序的消亡是有原因的。在这里,您真正想要完成什么?在与您的受信任代码相同的JVM中运行不受信任的代码,而您的受信任代码本应负责监督不受信任的代码,这是一个危险的想法。这是其中一个原因,但想想如果它只分配内存,直到虚拟机与OOME崩溃,会发生什么。恶意代码的过程不会与我的原始过程相同,本质上是强迫程序自杀吗?是的,但你也可以在jvm的另一个实例中启动该过程