我们有一个 Java 应用程序,希望使用内置的 Javascript 解释器 (javax.script.*) 运行不受信任的代码
但是默认情况下,解释器允许访问任何 java 类。例如java.lang.System.exit(0)
脚本中的 " " 将关闭 JVM。我相信这被称为“Live Connect”,有关详细信息,请参阅 Sun 的“Java Scripting Programmer's Guide”。
我想以某种方式关闭脚本访问 Java 类的能力,即我只希望脚本能够访问我使用eval()
或put()
方法专门注入的对象ScriptEngine
。
我找到了一些关于如何使用较旧的独立版本的解释器(Rhino)实现这一点的文档,例如参见http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/
然而,如果不使用 sun 内部类,这种方法在 JDK 1.6 中是不可能的,因为 ClassShutter 等都是在内部设置的,不能用公共方法覆盖。
我希望有一种简单的方法可以解决这个问题,不需要使用自定义的 SecurityManager、ClassLoader 等跳过复杂的环节,但找不到任何东西。
您会期望随着不同应用程序中围绕 Javascript 的安全公告的频率出现,会有一个简单的标志来禁用 Live Connect!