如何从nashorn引擎中删除java api



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

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

编辑:对不起,我忘了说我在我的java应用程序中运行nashorn,所以没有命令行参数可以使用

在编程上,你也可以直接使用NashornScriptEngineFactory类,它有一个合适的getScriptEngine()方法:

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

(恕我冒昧)

您可以通过-Dnashorn为脚本引擎指定任何js选项。参数,当您启动Java程序时。例如:

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

,其中Main使用javax。

你可以运行带有——no-java选项的"jjs"工具来防止脚本访问任何显式的Java包/类。也就是说,Nashorn平台是安全的,并且使用基于Java标准URL代码的安全模型(没有已知URL来源的'eval'-ed脚本被视为不可信的,未签名的代码,因此只能获得沙盒权限)。

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

最新更新