Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不';是否允许未签名的小程序创建自定义类加载器?_Java_Security_Applet_Classloader_Unsigned - Fatal编程技术网

Java 为什么不';是否允许未签名的小程序创建自定义类加载器?

Java 为什么不';是否允许未签名的小程序创建自定义类加载器?,java,security,applet,classloader,unsigned,Java,Security,Applet,Classloader,Unsigned,Java小程序不允许您编写自定义类加载器,除非您对小程序进行签名。为什么会这样?自定义类加载器只是一个查找类的工具。除了调用私有的“defineClass”方法外,您实际上无法加载该类,该方法是“受信任”的代码,因为它是由VM编写和控制的,而不是由小程序编写和控制的。您获得的权限并不比动态加载类的能力多。。。这真的没什么 我想作为一个附带的问题:有没有其他方法可以从动态的角度出发 byte[] => Class 未签名的小程序允许哪些操作?defineClass有一个Protection

Java小程序不允许您编写自定义类加载器,除非您对小程序进行签名。为什么会这样?自定义类加载器只是一个查找类的工具。除了调用私有的“defineClass”方法外,您实际上无法加载该类,该方法是“受信任”的代码,因为它是由VM编写和控制的,而不是由小程序编写和控制的。您获得的权限并不比动态加载类的能力多。。。这真的没什么

我想作为一个附带的问题:有没有其他方法可以从动态的角度出发

byte[] => Class

未签名的小程序允许哪些操作?

defineClass有一个ProtectionDomain参数,您可以使用包含AllPermission的PermissionCollection传递该参数,它允许您对主机执行基本上任何操作。

注意,您可以使用
java.net.URLClassLoader.newInstance
创建
类加载器。正如bkail所指出的,定制的
类加载器可以创建具有任意权限的类,也可以绕过其他安全约束。至于为什么没有比
java.net.URLClassLoader.newInstance
更一般的东西,那么就没有了。

所以,实际上,如果ProtectionDomain提供的权限比加载代码的权限多,那么这个方法抛出异常就够了吗?或者只是将权限限制在当前权限和给定权限的交叉点上(这样小程序就可以加载权限小于自身权限的代码)?这将是向后不兼容的。可以解决这个问题(java.lang.UntrustedClassLoader子类、opt-in注册方法等),但目前还不存在这样的机制。为什么会不兼容?如果我们做了这样的更改(在defineClass而不是构造函数中进行安全检查),会出现什么问题?JVM使用调用堆栈上的任意(可能是未授权的)代码调用loadClass,因此每个自定义类装入器都必须使用doPrivileged来确保它授予了适当的权限(这样做会绕过checkPackageAccess)。即使保存了构造函数中的AccessControlContext,也毫无疑问存在使用defineClass with AllPermission来增加其权限的非小程序非特权类加载器子类,并且该机制将中断。这实际上只是JVM缺少的一个功能。甚至只是一个“DefineClassUnprivilegd”这个方法很好,但他们还没有实现它。有一个关于它的错误报告已经存在了15年。