我的问题,类似于
why java security manager doesn't forbid neither creating new Thread() nor starting it?
我正在编写一个教学应用程序,允许学生提交执行某些任务的Java代码,并相互交互。
我们需要安全地加载,编译和执行一些代码。
使用Java工具,我们可以在内存中完成代码的编译;然后一个自定义类加载器加载代码,代码在一个线程中执行,具有一定的超时时间,并使用自定义安全管理器。
但是,学生仍然可以在他们的代码中创建Threads,将它们设置为循环并最终耗尽System / Tomcat资源。
有没有办法阻止创建线程?引用的答案说:
"""From your perspective, just change the policy."""
这在实践中意味着什么?
我试图覆盖方法checkPermission(Permission)和checkAccess(ThreadGroup),但我仍然无法拦截线程创建/启动
答案 0 :(得分:4)
您引用的other question的已接受答案是错误的。为了防止代码创建新线程,您需要将标准Java SecurityManager子类化,并覆盖getThreadGroup或checkAccess(ThreadGroup)。我已经用详细信息发布了对另一个问题的答案。
答案 1 :(得分:0)
看起来你想要做的就是创建另一个JVM(例如java进程),如果事情失控,可以批量杀死它。你有什么理由不这样做吗?
您还可以将自己的jar添加到新JVM的类路径中,并使用JAR作为入口点。这样,您可以在怀疑代码运行之前设置自定义安全管理器之类的东西。您还可以在具有受限权限的帐户下运行JVM,以防止恶意系统交互。