java 运行 自定义的 Groovy代码, 如何防止用户输入:System.exit(0) 、死循环的情况?

java 运行 自定义的 Groovy, 如何防止用户输入:System.exit(0) 、死循环等的情况?

阅读 469
评论
    2 个回答

    可以使用SecurityManager来实现System.exit退出调用的检查。如下

    class MySecurityManager extends SecurityManager {
      @Override public void checkExit(int status) {
        throw new SecurityException();
      }
    
      @Override public void checkPermission(Permission perm) {
          // 允许其他行为
      }
    }
    
    //使用以下调用:
    
    void myMethod() {
        //运行其他『危险』指令之前执行
        MySecurityManager secManager = new MySecurityManager();
        System.setSecurityManager(secManager);
    
        try {
           invokeExternal();
        } catch (SecurityException e) {
           //如果外部代码调用了 System.exit()
        }
    }

    死循环比较难定义, 因为可能是线程间事件等待,可能是耗时操作,简单的办法是把外部代码运行在单独的线程里运行, 然后设置超时时间,没有按时完成的直接停掉就好。但用户代码也可能生成新的Thread, 很难做到安全, 可以用Runtime.exec(String command)开启新的jvm, 对新的jvm启用自定义策略文件, 同时对新的jvm进行监控可能也是个办法。

      • 7.1k

      Jenkins的做法你可以参考(具体哪部分代码我忘了,以前看过Jenkins源码)

      定义一个白名单,在安全沙箱运行Groovy代码,限制只允许使用有限的Groovy方法

      定义任务超时,超时的任务自动停掉

        撰写回答

        登录后参与交流、获取后续更新提醒