我怎么能禁止jar在java中创建新线程

时间:2017-10-10 12:28:00

标签: java multithreading security access-control

我创建了一个简单的插件系统,允许其他人上传他们的插件jar,插件系统会加载它并在其中执行一些代码。

插件系统将获得Function<Input, Output>的子类来执行加载的插件逻辑,但我不希望该Function创建新的Thread或执行像System.exit这样的危险操作。我怎么能禁止这个动作?

我在Java中找到了AccessControllerSecurityManager,如何使用它来实现我的意图。

2 个答案:

答案 0 :(得分:4)

就像你说的,你可以添加一个安全管理器。类似下面的内容:您可以将代码放在try catch块中并捕获抛出的自定义安全异常。下面的代码在循环中运行并继续调用System.exit(1);

import java.security.Permission;

public class TestPreventSystemExit {

    public static void main(String[] args) {
        forbidSystemExitCall();
        while (true) {
            try {
                System.exit(1);
            } catch (Exception ex) {

            }
        }
    }

    private static class PreventExitException extends SecurityException {
    }

    private static void forbidSystemExitCall() {
        final SecurityManager securityManager = new SecurityManager() {
            public void checkPermission(Permission permission) {
                if (permission.getName().indexOf("exitVM") >= 0) {
                    System.out.println("Why you did this to me? :)");
                    throw new PreventExitException();
                }
            }
        };
        System.setSecurityManager(securityManager);
    }

}

答案 1 :(得分:1)

对于System.exit() - 请参阅其他答案。

为了防止线程的启动:可能,但需要扩展SecurityManager类 - 请参阅here

AccessController更多关于客户端如何编写可能被检查的代码。这不是你,因为JVM的“所有者”可以使用(参见here)。所以它对你的问题没有帮助。