我正在尝试沙箱JSR-223。具体地说,我不想让任何脚本访问我的任何类。(我听说Rhino可以用ClassShutter做到这一点,但我想一般地这么做。即。用于JSR-223的所有脚本引擎)。
我首先尝试使用AccessController.doPrivileged解决方案by passing no permissions at all。它适用于大多数权限,但脚本仍然可以访问我的所有公共类(它似乎忽略了“包访问”权限...?)。
I found this。我的问题是:如何在脚本引擎上安装自定义ClassLoader?(或者,如果有必要,我如何全局替换ClassLoader ?)
发布于 2009-09-10 22:28:23
ScriptEngineManager有一个接受类加载器的构造函数。类加载器用于加载脚本引擎实现。因为类继承了它们的类加载器,所以脚本引擎和它创建的任何对象也应该使用这个类加载器。
该类加载器需要拒绝任何未列入白名单的类的存在。
在此基础上添加一个自定义的SecurityManager,这样您就可以根据正在使用的类加载器进行访问检查。
编辑:这是我在Sandboxing Rhino in Java上找到的一篇文章。其中大部分也应该适用于JSR-223。Sun的实现是经过修改的Rhino,因此可能会有一些不同。
发布于 2009-09-09 13:45:05
是否可以在单独的JVM中运行应用程序中需要脚本引擎的部分?您可以使用不同的类路径(和安全管理器)启动脚本引擎JVM,然后在两个JVM之间使用某种形式的轻量级消息传递。
发布于 2011-04-02 08:32:58
请参阅同一个包中的http://code.google.com/p/prebake/source/browse/trunk/code/src/org/prebake/js/RhinoExecutor.java和相关类,特别是SANDBOXING_FACTORY。
这是一些用沙箱保护rhino解释器以允许其访问由加载器中介的文件系统的代码。
https://stackoverflow.com/questions/1399505
复制相似问题