14

我正在尝试对 JSR-223 进行沙箱处理。具体来说,我不希望任何脚本可以访问我的任何课程。(我听说 Rhino 可以用 ClassShutter 做到这一点,但我想一般地做到这一点。即适用于 JSR-223 的所有脚本引擎)。

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

找到了这个。我的问题是:如何在脚本引擎上安装自定义 ClassLoader?(或者如果必须,我如何全局替换 ClassLoader?)

4

3 回答 3

8

ScriptEngineManager 有一个带有类加载器的构造函数。类加载器用于加载脚本引擎实现。由于类继承了它们的类加载器,脚本引擎和它创建的任何对象也应该使用该类加载器。

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

使用自定义的 SecurityManager 来完成它,这样您就可以根据正在使用的类加载器进行访问检查。

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

于 2009-09-10T22:28:22.627 回答
0

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

于 2009-09-09T13:45:04.620 回答
0

请参阅http://code.google.com/p/prebake/source/browse/trunk/code/src/org/prebake/js/RhinoExecutor.java和同一包中的相关类,尤其是那里的 SANDBOXING_FACTORY。

这是一些将 rhino 解释器沙箱化的代码,以允许它访问由加载器介导的文件系统。

于 2011-04-02T00:32:57.957 回答