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

时间:2017-06-01 21:40:03

标签: java multithreading security

我目前正在开发一个程序来运行用户提供的外部代码(假设这种情况是合理的)。经过大量的研究,我发现大多数涉及此问题的安全性都可以由SecurityManager处理;但是,如果外部代码花费的时间太长并且打算恶意,我很难找到杀死外部代码的方法。例如,如果外部代码如下所示:

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

这将永远运行,Thread.interrupt()不会做任何事情来阻止线程。是否有另一种方法来阻止不会导致任何问题的流氓线程?我所遇到的只是Thread.stop()但是它似乎不是一个选项,似乎与它有关的所有问题。如果没有,是否还有其他选项可以运行此代码,程序仍然可以直接与它连接?

2 个答案:

答案 0 :(得分:0)

刚刚杀死执行代码的java进程。

假设使用GNU / Linux或macOS系统:

ps -ax | grep java # identify the correct process
kill $pid          # kill it

您可以通过访问Runtime:

在Java中执行此操作
Process p = Runtime.getRuntime().exec(new String[]{"bash","-c","cmd 1 goes here"});

编辑:

考虑到你还需要编译用户提供的代码,编译它并在自己的jvm中启动它是有意义的。

此外,在完全虚拟机中执行代码将是理想的,因为代码是沙箱化的,无法访问主机。

答案 1 :(得分:0)

我相信在Java中没有办法像你正在描述的那样杀死一个线程。如果线程正在执行,它只是设置一个标志,它由线程来注意它或中断线程等待或在睡眠中将抛出的模式 InterruptedException

唯一的办法就是杀死线程正在运行的进程。

 call System.exit(int)