java - 从安全沙箱(例如小程序)中生成自定义类

标签 java security applet classloader securitymanager

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

这是一个视觉概览;如您所见,我停留在第 2 阶段:

underpants gnomes

我最初打算使用自定义类加载器。显然这在小程序中是不允许的; ClassLoader 构造函数抛出 SecurityException。

然后我考虑打电话ClassLoader.defineClass(String name, byte[] b, int off, int len)直接在另一个类加载器上,但该方法是 protected 。

我试图通过反射使该方法可访问。我的希望并不高,但我试过了,确实也抛出了一个 SecurityException。

URLClassLoader似乎提供了救赎:它有一个静态工厂创建方法,不会抛出任何安全异常。但是,该技术不允许对加载器进行子类化或访问 protected defineClass 方法。它只接受一组 URL 对象。

所以我尝试子类化URL覆盖它的 openConnection 方法以那样返回我的类字节,但 URL 类是最终的。

然后我尝试创建自定义 URLStreamHandler使用重写的 openConnection 方法并将其传递给 URL 的构造函数。 SecurityManager 对此再次发火。

然后我尝试使用自定义工厂调用 URL.setStreamHandlerFactory,该工厂将返回我的自定义流处理程序。又是 SecurityManager 提示,因为不提示还有什么用?

然后我尝试创建一个 javax.management.loading.MLet .我不知道它的用途,但它是 URLClassLoader 的子类,允许在其构造函数中指定自定义 URLStreamHandlerFactory 并且没有提到抛出安全异常,但它仍然这样做了。

无奈之下,我尝试调用ProxySelector .setDefault 与自定义 ProxySelector,希望拦截 URL 并以某种方式将其路由回我的小程序,但我也没有权限。

我尝试设置 java.system.class.loader属性(property)通过<param name="java_arguments" ...>标签,但它似乎不是荣誉属性之一。

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

如果可能的话,我愿意在普通的未签名小程序安全沙箱中执行此操作,以便体验是无缝的。

但大多数时候我只是感到困惑,因为如果这不可能,那就没有意义了。 如果 SecurityManager 乐于从任意外部 URL 加载类,它不应该介意从局部变量中的字节数组加载类。 该限制仍然没有意义。代码仍然是内部的和沙盒的。

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

帮助!

最佳答案

..the SecurityManager again, complaining, because what else is it good for if not complaining?

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

..how do I load the class?

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

..send my class bytes up to a remote server that will generate a temporary URL that I can use in conjunction with URLClassLoader.newInstance(URL[]).

沙盒小程序无法创建 URLClassLoader

关于java - 从安全沙箱(例如小程序)中生成自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13844785/

相关文章:

Java 进程占用的内存超过其最大堆大小

c# - 如何在 .NET 中验证 DLL 的数字签名

java - 了解 Java applet 的 getParent 方法

java - 如何在 Bonita BPM 表单中显示小程序?

java - Spring MVC 列表属性

java - 如何从 RecyclerView Adapter 中的 Sharedpreferences 获取数据并传递到下一个 fragment

java - 使用java从json对象中提取json字符串数组值

php - 如果用户不是来自 HERE,则不处理 - 如何处理?

java - 谷歌应用引擎 : custom authentication

java - 如何在 Java 中移动矩形?