【问题标题】:Preventing Thread creation/start in Java防止在 Java 中创建/启动线程
【发布时间】:2014-03-06 04:06:22
【问题描述】:

我的问题,类似于

why java security manager doesn't forbid neither creating new Thread() nor starting it?

我正在编写一个教学应用程序,允许学生提交执行某些任务并相互交互的 java 代码。

我们需要安全地加载、编译和执行一些代码。

使用Java工具我们可以在内存中完成代码的编译;然后自定义类加载器加载代码,代码在线程中执行,有一定的超时时间,并使用自定义安全管理器。

但是,学生仍然可以在他们的代码中创建线程,将它们设置为循环并最终耗尽 System/Tomcat 资源。

有没有办法阻止线程的创建?引用的答案说:

"""From your perspective, just change the policy."""

这在实践中意味着什么?

我试图覆盖方法 checkPermission(Permission) 和 checkAccess(ThreadGroup) 但我仍然无法拦截线程创建/启动

【问题讨论】:

    标签: java multithreading securitymanager


    【解决方案1】:

    您引用的other question 的公认答案不正确。为了防止代码创建新线程,您需要继承标准 Java SecurityManager 并覆盖 getThreadGroup 或 checkAccess(ThreadGroup)。我已经发布了另一个问题的答案以及详细信息。

    【讨论】:

      【解决方案2】:

      似乎您想要做的是创建另一个 JVM(例如 java 进程),如果事情失控,可以将其全部杀死。你有什么理由不这样做吗?

      您还可以将自己的 jar 添加到新 JVM 的类路径中,并使用您的 JAR 作为入口点。这样,您可以在可疑代码运行之前设置自定义安全管理器等内容。您还可以在权限受限的帐户下运行 JVM,以防止恶意系统交互。

      【讨论】:

      • 是的,我不想创建另一个 JVM,因为(将来)学生代码应该能够在他们的代码可以修改环境的“模拟游戏”中进行交互,并且下一个学生可以看到新的、更新的对象图。例如,我想避免继续对整个世界结构进行序列化和反序列化。
      猜你喜欢
      • 2012-01-28
      • 1970-01-01
      • 2015-09-20
      • 2010-12-25
      • 2013-05-31
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多