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

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

阅读 4.5k
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进行监控可能也是个办法。

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题