2017-10-10 64 views
0

我已经创建了一个简单的插件系统,允许其他人上传他们的插件的jar,插件系统将加载它并在其中执行一些代码。如何禁止一个jar在java中创建新线程

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

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

回答

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

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

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

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

+1

链接的答案描述了如何使用SecurityManager来防止线程启动,所以我不确定如何得出结论,这是不可能的。从答案中可以得出结论:“解决这个问题的一个方法是继承java.lang.SecurityManager并覆盖getThreadGroup方法以返回根ThreadGroup。这将允许您控制代码是否可以根据它是否具有java创建线程。 lang.RuntimePermission“modifyThreadGroup”。“ –

+0

感谢您对我更新我的答案的快速反馈;-) – GhostCat

+0

@GhostCat FGITW嗯? – Gab