【问题标题】:how can i forbid a jar create new thread in java我如何禁止 jar 在 java 中创建新线程
【发布时间】:2018-03-21 20:45:39
【问题描述】:

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

插件系统将获得Function<Input, Output> 的子类来执行加载的插件逻辑,但我不希望该函数创建新线程或执行诸如System.exit 之类的危险操作。如何禁止此操作?

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

【问题讨论】:

    标签: java multithreading security access-control


    【解决方案1】:

    如您所说,您可以添加安全管理器。如下所示:您可以将代码放入 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);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 您链接的答案描述了如何使用 SecurityManager 来防止线程启动,因此我不确定您如何得出结论认为这是不可能的。从答案:“解决这个问题的一种方法是子类化 java.lang.SecurityManager 并覆盖 getThreadGroup 方法以返回根 ThreadGroup。这将允许您控制代码是否可以根据是否具有 java.lang.SecurityManager 来创建线程。 lang.RuntimePermission "修改线程组"。"
      • 感谢您对我更新答案的快速反馈;-)
      • @GhostCat FGITW 嗯?
      • 当然不是,另一个人比我快得多(至少 30 秒)。
      • 也可以使用AccessController / AccessControlContext 方式执行此操作,通过ClassLoader 将它加载的类映射到ProtectionDomains 没有RuntimePermission @987654330 @ (他们这样做,在他们的默认加载器下)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多