Java 沙箱JSR-223

Java 沙箱JSR-223,java,security,scripting,jsr223,Java,Security,Scripting,Jsr223,我正在尝试沙箱JSR-223。具体来说,我不希望任何脚本能够访问我的任何类。(我听说Rhino可以用ClassShutter实现这一点,但我一般都想这么做。也就是说,对于JSR-223的所有脚本引擎) 我首先尝试使用AccessController.doPrivileged解决方案。它适用于大多数权限,但脚本仍然可以访问我的所有公共类(它似乎忽略了“包访问”权限…?) 我。我的问题是:如何在脚本引擎上安装自定义类加载器?(或者,如果必须,如何全局替换类加载器?是否可以在单独的JVM中运行需要脚本

我正在尝试沙箱JSR-223。具体来说,我不希望任何脚本能够访问我的任何类。(我听说Rhino可以用ClassShutter实现这一点,但我一般都想这么做。也就是说,对于JSR-223的所有脚本引擎)

我首先尝试使用
AccessController.doPrivileged
解决方案。它适用于大多数权限,但脚本仍然可以访问我的所有公共类(它似乎忽略了“包访问”权限…?)


我。我的问题是:如何在脚本引擎上安装自定义类加载器?(或者,如果必须,如何全局替换类加载器?

是否可以在单独的JVM中运行需要脚本引擎的应用程序部分?您可以使用不同的类路径(和安全管理器)启动脚本引擎JVM,然后在两个JVM之间使用某种形式的轻量级消息传递。

ScriptEngineManager有一个构造函数,它接受类加载器。类加载器用于加载脚本引擎实现。当类继承其类加载器时,脚本引擎及其创建的任何对象也应该使用该类加载器

该类加载器需要拒绝任何未列入白名单的类的存在

用一个自定义的SecurityManager结束它,这样您就可以根据正在使用的类加载器进行访问检查

编辑:这是我在上找到的一篇文章。其中大部分也应适用于JSR-223。Sun的实现是经过修改的Rhino,因此可能存在一些差异。

请参阅同一软件包中的类和相关类,特别是其中的沙盒工厂


这是一些将rhino解释器沙箱化的代码,允许它通过加载程序访问文件系统。

感谢您的想法。是的,我能做到。但就我而言,这不是一个选择。实际上,我将一个巨大的DOM文档传递给脚本(我唯一允许访问的对象)。我不想在内存中增加一倍。使用passthroughproxy处理器,实现类加载器之间的通信并不困难,而且您也不必复制整个DOM。谢谢我试过了。但出于某种原因,我的类加载器只需要com.sun.script.javascript.RhinoScriptEngineFactory和其他引擎工厂。上次我玩自定义类加载器时,我也很难让它一直使用我的类加载器。我相信除了在Class.forName()中传递类加载器外,我还必须使用Thread.currentThread().setContextClassLoader(cl)。如何使用自定义类加载器拒绝对通过引导类加载器加载的类的访问?父类加载器不是总是先检查的吗,而且不是最后检查的吗?如果不能从引导类加载器中孤立自定义类加载器,则不能拒绝访问权限源,例如
System.exit(int)
。创建新类加载器时,可以使用
super(null)
构建一个没有父类的类加载器。然后,您的实现可以显式地委托给白名单类型的系统类加载器。注意:沙箱不能单独使用类加载器。您还需要使用SecurityManager。