我正在尝试沙箱JSR-223。具体来说,我不希望任何脚本可以访问我的任何类。 (我听说Rhino可以用ClassShutter做到这一点,但我想一般性地做。即对于JSR-223的所有脚本引擎。)
我首先尝试使用AccessController.doPrivileged
解决方案by passing no permissions at all。它适用于大多数权限,但脚本仍然可以访问我的所有公共类(它似乎忽略“包访问”权限......?)。
我found this。我的问题是:如何在脚本引擎上安装自定义ClassLoader? (或者,如果必须,如何全局替换ClassLoader?)
答案 0 :(得分:8)
ScriptEngineManager有一个构造函数,它接受一个类加载器。类加载器用于加载脚本引擎实现。当类继承其类加载器时,脚本引擎及其创建的任何对象也应该使用该类加载器。
该类加载器需要否认存在任何未列入白名单的类。
使用自定义SecurityManager进行补充,以便您可以对正在使用的类加载器进行访问检查。
修改:这是我在Sandboxing Rhino in Java上找到的一篇文章。其中大部分内容也适用于JSR-223。 Sun的实现是Rhino的修改,因此可能存在一些差异。
答案 1 :(得分:0)
是否可以在单独的JVM中运行需要脚本引擎的应用程序部分?您可以使用不同的类路径(和安全管理器)启动脚本引擎JVM,然后在两个JVM之间使用某种形式的轻量级消息传递。
答案 2 :(得分:0)
请参阅同一个软件包中的http://code.google.com/p/prebake/source/browse/trunk/code/src/org/prebake/js/RhinoExecutor.java及相关类,尤其是那里的SANDBOXING_FACTORY。
这是一些代码,用于对rhino解释器进行沙盒化,以允许它访问由加载器调解的文件系统。