如何从Nashorn引擎中删除java apis?

是否可以从nashorn-engine隐藏或删除java api? 因此它只能看到或使用“默认”ECMAScript 262 Edition 5.1以及一些特别暴露的函数/变量?

我想让我的最终用户为他们自己创建一些特定的逻辑,而不用担心他们会破解整个系统。 当然,在nashorn引擎等中可能存在一些安全漏洞,但这是不同的主题。

编辑:对不起,我忘了提到我在我的java应用程序中运行nashorn,因此不能使用命令行参数。

在编程方面,您还可以直接使用具有适当的getScriptEngine()方法的NashornScriptEngineFactory类:

 import jdk.nashorn.api.scripting.NashornScriptEngineFactory; ... NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); ... ScriptEngine engine = factory.getScriptEngine("-strict", "--no-java", "--no-syntax-extensions"); 

好的,这是带有一些限制参数的示例类:

 package com.pasuna; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Random; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptException; import jdk.nashorn.api.scripting.NashornScriptEngineFactory; public class ScriptTest { public static class Logger { public void log(String message) { System.out.println(message); } } public static class Dice { private Random random = new Random(); public int D6() { return random.nextInt(6) + 1; } } public static void main(String[] args) { NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); ScriptEngine engine = factory.getScriptEngine(new String[]{"-strict", "--no-java", "--no-syntax-extensions"}); //note final, does not work. final Dice dice = new Dice(); final Logger logger = new Logger(); engine.put("dice", dice); engine.put("log", logger); engine.put("hello", "world"); try { engine.eval("log.log(hello);"); engine.eval("log.log(Object.keys(this));"); engine.eval("log.log(dice.D6());" + "log.log(dice.D6());" + "log.log(dice.D6());"); engine.eval("log.log(Object.keys(this));"); engine.eval("Coffee"); //boom as should engine.eval("Java"); //erm? shoud boom? engine.eval("log = 1;"); //override final, boom, nope engine.eval("log.log(hello);"); //boom } catch (final ScriptException ex) { ex.printStackTrace(); } BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = ""; do { try { input = br.readLine(); engine.eval(input); } catch (final ScriptException | IOException se) { se.printStackTrace(); } } while (!input.trim().equals("quit")); try { engine.eval("var add = function(first, second){return first + second;};"); Invocable invocable = (Invocable) engine; Object result = invocable.invokeFunction("add", 1, 2); System.out.println(result); } catch (final NoSuchMethodException | ScriptException se) { se.printStackTrace(); } Object l = engine.get("log"); System.out.println(l == logger); } } 

有关标志的更多信息可以在这里找到: http : //hg.openjdk.java.net/jdk8/jdk8/nashorn/rev/eb7b8340ce3a

(imho atm nashorn文档很差)

启动Java程序时,可以通过-Dnashorn.args选项为脚本引擎指定任何jjs选项。 例如:

 java -Dnashorn.args=--no-java Main 

Main使用带有nashorn引擎的javax.script API。

您可以使用–no-java选项运行“jjs”工具,以防止从脚本中进行任何显式Java包/类访问。 这就是说Nashorn平台是安全的并且使用基于Java标准URL代码库的安全模型(没有已知URL原点的’eval’-ed脚本被视为不受信任的未签名代码,因此只获得沙箱权限。

–no-java是关闭java扩展的主要标志。 –no-syntax-extensions关闭非标准扩展。