嵌入式 Nashorn - 沙盒执行
embedded Nashorn - sandboxing execution
我想就如何在 Java 应用程序中沙箱执行 Nashorn 得到一个明确的答案。
我已经看到 'similar questions'(我将参考),但最终 none 的答案似乎解决了我的担忧。
让我从定义开始。
假设我们从这个开始:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.put("map",new HashMap());
engine.eval(jsCode); // jsCode can access 'map' only.
"Sandboxing" 我的意思是确保 Java 脚本不能访问任何 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;
}
});
但是直接访问jdk.*开头的包是'safe'吗?
我看到的另一种方法更玄乎:
final ScriptEngine engine =
new NashornScriptEngineFactory().getScriptEngine(new String[] { "--no-java" });
我在这里看到了那个:
Safely re-using sandboxed Nashorn containers
有人可以告诉我吗?
如果对您的申请有帮助,您可以使用 jdk.nashorn.api.scripting.* API。 java同样的文档在这里 -> https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/
是的,--no-java 是防止脚本代码 java 包访问的选项。
我想就如何在 Java 应用程序中沙箱执行 Nashorn 得到一个明确的答案。
我已经看到 'similar questions'(我将参考),但最终 none 的答案似乎解决了我的担忧。
让我从定义开始。
假设我们从这个开始:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.put("map",new HashMap());
engine.eval(jsCode); // jsCode can access 'map' only.
"Sandboxing" 我的意思是确保 Java 脚本不能访问任何 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;
}
});
但是直接访问jdk.*开头的包是'safe'吗?
我看到的另一种方法更玄乎:
final ScriptEngine engine =
new NashornScriptEngineFactory().getScriptEngine(new String[] { "--no-java" });
我在这里看到了那个: Safely re-using sandboxed Nashorn containers
有人可以告诉我吗?
如果对您的申请有帮助,您可以使用 jdk.nashorn.api.scripting.* API。 java同样的文档在这里 -> https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/
是的,--no-java 是防止脚本代码 java 包访问的选项。