首页 文章

从安全沙箱(例如,applet)中生成自定义类

提问于
浏览
2

我希望能够在(unsigned)applet中生成和加载自定义类 . 生成它们我可以处理,但我正在与安卓管理器进行斗争,它似乎不希望我加载它们 .

这是一个视觉概述;你可以看到我坚持第二阶段:

underpants gnomes

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

然后我考虑直接在另一个类加载器上调用ClassLoader.defineClass(String name, byte[] b, int off, int len),但该方法受到保护 .

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

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

所以我尝试子类URL来覆盖它的openConnection方法以返回我的类字节,但URL类是final .

然后我尝试使用重写的openConnection方法创建自定义URLStreamHandler并将其传递给URL的构造函数 . SecurityManager再次提出了这个问题 .

那么我尝试使用自定义工厂调用URL.setStreamHandlerFactory,该工厂将返回我的自定义流处理程序 . 又有安全管理器抱怨,因为如果不抱怨还有什么好处呢?

那么我尝试创建一个javax.management.loading.MLet . 我不知道它是什么_12402630_是URLClassLoader的子类,允许在其构造函数中指定自定义URLStreamHandlerFactory,并且没有提到抛出安全异常,但它仍然无论如何 .

无奈之下,我尝试使用自定义ProxySelector调用ProxySelector .setDefault,希望能够拦截一个URL并以某种方式将其路由回我的applet,但我也没有这个权限 .

我尝试通过 <param name="java_arguments" ...> 标签设置 java.system.class.loader 属性,但它似乎不是一个荣幸的属性 .

最后,我能想到的唯一剩下的方法是将我的类字节发送到远程服务器,该服务器将生成一个临时URL,我可以将其与URLClassLoader.newInstance(URL [])结合使用 . 这会有效,但我真的不喜欢这个想法 . 通过不同的ClassLoader的交互,似乎它可以快速复杂化,并且服务器依赖性对于我想要做的事情并不真实 . 显然,SecurityManager非常乐意让你创建一个URLClassLoader,但是当你尝试使用它时会自发地沮丧 .

我想在普通的unsigned applet安全沙箱中执行此操作,如果可能的话,那么体验是无缝的 .

但大多数情况下我不可能没有意义 . 如果SecurityManager对从任意外部URL加载类感到高兴,那么它不应该介意从局部变量中的字节数组加载一个 . 限制仍然是荒谬的 . 代码仍然是内部和沙盒 .

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

救命!

1 回答

  • 1

    ..安全管理员再次抱怨,因为如果不抱怨还有什么好处呢?

    它是为了保护最终用户,而不是做你正在尝试的各种事情 .

    ..我怎么加载课程?

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

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

    沙盒小程序无法创建 URLClassLoader .

相关问题