如何锁定(或沙箱)JDK的内置Javascript解释器来运行不受信任的脚本

时间:2010-01-27 23:33:23

标签: javascript security sandbox jdk1.6

我们有一个Java应用程序,并希望使用内置的Javascript解释器(javax.script。*)运行不受信任的代码。

但是,默认情况下,解释器允许访问任何java类。例如,脚本中的“java.lang.System.exit(0)”将关闭JVM。我相信这称为“Live Connect”,有关详细信息,请参阅Sun的“Java脚本编程程序指南”。

我想以某种方式关闭脚本访问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!

2 个答案:

答案 0 :(得分:1)

查看java sandbox library以及如何准确完成groovy(http://blog.datenwerke.net/2013/06/sandboxing-groovy-with-java-sandbox.html)所需内容的帖子。犀牛可以用类似的方式解决。

答案 1 :(得分:1)

我搜索了很多,试过了codeutopia.net的博客沙箱方式和其他SecurityManager解决方案,感到不满意。然后出来了我的类加载器解决方案,基于JDK嵌入式rhino库而不导入任何第三方库。两个带有大约200行代码的java类,它是目前我最简单的解决方案,符合我的JavaScript要求。

  1. 通过ScriptEngineManager#getEngineFactories
  2. 找出JavaScript脚本引擎工厂类名
  3. 在新的类加载器中加载脚本引擎工厂类,其中将忽略JavaMembers或其他相关类。
  4. 在已加载的脚本引擎工厂上调用#getScriptEngine,在返回的脚本引擎上调用eval脚本。
  5. 如果给定的脚本包含Java脚本,则类加载器将尝试加载JavaMembers或其他类并触发类未找到的异常。这样,恶意脚本将被忽略而不执行。

    请阅读ConfigJSParser.java和ConfigJSClassLoader.java文件以获取更多详细信息:

    https://github.com/webuzz/simpleconfig/tree/master/js/im/webuzz/config