Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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_Securitymanager - Fatal编程技术网

Java 从安全沙盒中生成自定义类(例如,小程序)

Java 从安全沙盒中生成自定义类(例如,小程序),java,security,applet,classloader,securitymanager,Java,Security,Applet,Classloader,Securitymanager,我希望能够在(未签名的)小程序中生成和加载自定义类。生成它们我可以处理,但我正在与applet SecurityManager进行斗争,它似乎不希望我加载它们 这里是一个视觉概述;正如你所看到的,我被困在第二阶段: 我最初打算使用自定义类装入器。显然,小程序中不允许这样做;ClassLoader构造函数引发SecurityException 然后我考虑直接调用另一个类装入器,但该方法受到保护 我试图通过反射来访问该方法。我对它的期望并不高,但我尝试了一下,这也引发了一个安全例外 似乎提供了拯救

我希望能够在(未签名的)小程序中生成和加载自定义类。生成它们我可以处理,但我正在与applet SecurityManager进行斗争,它似乎不希望我加载它们

这里是一个视觉概述;正如你所看到的,我被困在第二阶段:

我最初打算使用自定义类装入器。显然,小程序中不允许这样做;ClassLoader构造函数引发SecurityException

然后我考虑直接调用另一个类装入器,但该方法受到保护

我试图通过反射来访问该方法。我对它的期望并不高,但我尝试了一下,这也引发了一个安全例外

似乎提供了拯救:它有一个静态工厂创建方法,不抛出任何安全异常。但是,这种技术不允许对加载程序进行子类化或访问受保护的defineClass方法。它只接受URL对象数组

因此,我尝试使用子类重写其openConnection方法,以这种方式返回我的类字节,但URL类是最终的

然后,我尝试使用一个被重写的openConnection方法创建一个自定义,并将其传递给URL的构造函数。安全经理对此又大发雷霆

因此,我尝试使用一个自定义工厂调用URL.setStreamHandlerFactory,该工厂将返回我的自定义流处理程序。又有一位安全经理在抱怨,因为如果不抱怨还有什么好处

于是我试着创造一个新的世界。我不知道它的用途是什么,但它是URLClassLoader的一个子类,允许在其构造函数中指定自定义URLStreamHandlerFactory,并且没有提到引发安全异常,但它仍然这样做

在绝望中,我尝试使用自定义代理选择器调用.setDefault,希望接收URL并以某种方式将其路由回我的小程序,但我也没有这样做的权限

我尝试通过
标记设置
java.system.class.loader
属性,但它似乎不是一个值得尊敬的属性

最后,我能想到的唯一剩下的方法是将我的类字节发送到远程服务器,该服务器将生成一个临时URL,我可以与URLClassLoader.newInstance(URL[])一起使用。那行得通,但我真的不喜欢这个主意。随着不同类加载器的交互,它似乎会变得很复杂,而服务器依赖性对于我想要做的事情来说并不实际。显然,SecurityManager非常乐意让您创建一个URLClassLoader,但当您尝试使用它时,它会自然地感到不安

如果可能的话,我想在正常的未签名小程序安全沙箱中执行此操作,以便体验无缝

但大多数情况下,我只是感到困惑,因为如果这不可能,那就毫无意义。如果SecurityManager乐于从任意外部URL加载类,那么它不介意从局部变量的字节数组加载类。这个限制仍然是荒谬的。代码仍然是内部的,并且是沙盒

它对于动态代码生成和实现自定义JAR压缩(如LZMA压缩)都很有用

救命啊

…安全经理又抱怨了,因为如果不抱怨还有什么好处

它是为了保护最终用户,防止他们做你正试图做的事情

…我如何加载该类

签署Jar,让用户接受数字签名的代码

…将我的类字节发送到远程服务器,该服务器将生成一个临时URL,我可以与URLClassLoader.newInstance(URL[])一起使用


沙盒小程序无法创建
URLClassLoader

我正在与似乎不希望我加载它们的小程序安全管理器进行斗争。“我怀疑
AccessControlException
的结果是非常明确的,没有关于它的“似乎”。当然,我为什么希望看到这个小程序在沙盒中创建新代码并加载它呢?给小程序签名。问题很明显,我如何加载这个类?正如我在远程服务器示例中指出的那样,阻止它绝对没有安全优势。顺便说一句,无论您的意图多么单纯,如果您在安全沙盒中找到了这样做的方法,这就是一个安全漏洞!那就不可能了?但是为什么呢?这会有什么不同?我不是安全专家。我只知道JRE不允许沙盒小程序中有任何数量的东西。例如反射、文件I/O、动态加载类……这令人失望。我对此有点生气,但我接受你的回答。存在这种愚蠢的限制不是你的错。