嵌入式Nashorn - 沙盒执行

时间:2017-03-01 14:27:59

标签: java nashorn scriptengine

我想得到一个关于如何在Java应用程序中执行Sandbox执行Nashorn的明确答案。

我看过类似的问题' (我将参考)但最终没有一个答案似乎解决了我的担忧。

让我从定义开始。

假设我们从这开始:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.put("map",new HashMap()); 
engine.eval(jsCode); // jsCode can access 'map' only.

通过"沙盒"我的意思是确保JavaScript不能访问任何java对象,除了在作用域中添加的对象。

所以以下的证据应该没问题。

engine.eval("map.toString()"); 
engine.eval("map.size()"); 
engine.eval("map.put('name','jeff'); "); 
engine.eval("map.getClass()"); 

但以下证据不会:

engine.eval("var m = new java.util.HashMap();"); // <-- stop accessing Java
engine.eval("map.getClass().forName('java.io.File'); "); // stop. it's trying to be sneaky

最后,我并不担心这个:

engine.eval("while(1) {;}"); // this is impossible to detect. Maybe it's possible for this simple case... but sneaky users could make it impossible to detect... anyway this is not what I am asking. I am only concerned on accessing java objects.

因此,通过沙盒,我打算阻止jsCode访问我没有定义的java对象。

我看到这可能是一个潜在的解决方案:

jdk.nashorn.api.scripting.NashornScriptEngineFactory factory = new  jdk.nashorn.api.scripting.NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine(new jdk.nashorn.api.scripting.ClassFilter() {

    public boolean exposeToScripts(String s) {
        return false;
    }

});

但它是否安全&#39;以jdk。*直接访问以?

开头的软件包

我看到的另一种方法更加神秘:

final ScriptEngine engine = 
   new NashornScriptEngineFactory().getScriptEngine(new String[] { "--no-java" }); 

我在这里看到了一个: Safely re-using sandboxed Nashorn containers

有人可以告诉我吗?

1 个答案:

答案 0 :(得分:0)

如果这对您的应用程序有帮助,您可以使用jdk.nashorn.api.scripting。* API。相同的javadoc在这里 - &gt; https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/

是的, - no-java是防止脚本代码访问java包的选项。