如何禁止jar在java中创建新线程
我创建了一个简单的插件系统,允许其他人上传他们插件的jar,插件系统将加载它并在其中执行一些代码 插件系统将获得一个子类如何禁止jar在java中创建新线程,java,multithreading,security,access-control,Java,Multithreading,Security,Access Control,我创建了一个简单的插件系统,允许其他人上传他们插件的jar,插件系统将加载它并在其中执行一些代码 插件系统将获得一个子类Function来执行加载的插件逻辑,但我不希望该函数创建新线程或执行一些危险操作,如system.exit。我怎样才能禁止这种行为 我在Java中找到了AccessController或SecurityManager,以及如何使用它来实现我的意图。正如您所说,您可以添加一个安全管理器。如下所示:您可以将代码放入try-catch块中,并捕获抛出的自定义安全异常。下面的代码在循
Function
来执行加载的插件逻辑,但我不希望该函数创建新线程或执行一些危险操作,如system.exit
。我怎样才能禁止这种行为
我在Java中找到了
AccessController
或SecurityManager
,以及如何使用它来实现我的意图。正如您所说,您可以添加一个安全管理器。如下所示:您可以将代码放入try-catch块中,并捕获抛出的自定义安全异常。下面的代码在循环中运行并继续调用系统。退出(1)
正如您所说,您可以添加一个安全管理器。如下所示:您可以将代码放入try-catch块中,并捕获抛出的自定义安全异常。下面的代码在循环中运行并继续调用系统。退出(1) 有关
System.exit()
,请参阅其他答案
用于防止线程启动:可能,但需要扩展SecurityManager类-请参阅
AccessController
更多的是关于客户端如何编写可能被检查的代码。作为JVM的“所有者”,您不能使用它(请参阅)。因此,它对您的问题没有帮助。有关System.exit()
-请参阅其他答案
用于防止线程启动:可能,但需要扩展SecurityManager类-请参阅
AccessController
更多的是关于客户端如何编写可能被检查的代码。作为JVM的“所有者”,您不能使用它(请参阅)。因此,它对您的问题没有帮助。您链接的答案描述了如何使用SecurityManager来防止线程启动,因此我不确定您如何得出这样的结论:这是不可能的。答案是:“解决这个问题的一种方法是将java.lang.SecurityManager子类化,并重写getThreadGroup方法以返回根线程组。这将允许您根据代码是否具有java.lang.RuntimePermission“modifyThreadGroup”来控制代码是否可以创建线程。”感谢您对我更新答案的快速反馈;-)@GhostCat FGITW hmmm?当然不是,另一个人比我快得多(至少30秒)。也可以通过AccessController
/AccessControlContext
的方式,通过一个ClassLoader
将它加载的类映射到ProtectionDomain
没有运行时权限的类“exitVM.*”
(它们在默认加载程序下执行此操作)。您链接的答案描述了如何使用SecurityManager阻止线程启动,因此我不确定您如何得出不可能的结论。从答案:解决这个问题的一种方法是将java.lang.SecurityManager子类化,并重写getThreadGroup方法以返回根ThreadGroup。这将允许您根据代码是否具有java.lang.RuntimePermission“modifyThreadGroup”来控制代码是否可以创建线程。“感谢您在我更新答案时提供的快速反馈;-)@GhostCat FGITW hmmm?当然不是,另一个人比我快得多(至少30秒)。也可以通过AccessController
/AccessControlContext
的方式,通过ClassLoader
将加载的类映射到ProtectionDomain
中没有RuntimePermission
“exitVM.*(它们在默认加载程序下会这样做)的。
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);
}
}