当前位置: 首页 > 面试题库 >

如何从Nashorn引擎中删除Java API?

薛弘壮
2023-03-14
问题内容

是否可以从nashorn引擎隐藏或删除java api?这样它只能看到或使用带有某些特别暴露的函数/变量的“默认” ECMAScript 262
Edition 5.1?

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

编辑:对不起,我忘了提及我在Java应用程序中运行nashorn,因此无法使用任何命令行参数。


问题答案:

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

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

(nashorn文档的imho atm很差)



 类似资料:
  • 是否可以从nashorn引擎中隐藏或删除java api?所以它只能看到或使用“默认”ECMAScript 262版本5.1,以及一些特别公开的函数/变量? 我想让我的最终用户为自己创建一些特定的逻辑,而不用担心他们会入侵整个系统。当然,nashorn引擎中可能存在一些安全漏洞等,但这是不同的主题。 编辑:很抱歉,我忘了提到我正在java应用程序中运行nashorn,所以不能使用命令行参数。

  • 我对SqlAlchemy和Firebird DB是新手。 我可以直接使用DBeaver创建一个表: 但如果我尝试使用pyndas sqlalchemy执行同样的操作,我会得到一个错误: 问题是由引号

  • 我正在尝试使用新的Java 8 Nashorn javascript引擎运行javascript脚本,但失败,出现以下错误: 脚本使用应在全局作用域中定义的readfull函数,nashorn在启用脚本模式的情况下运行(如图所示,在通过脚本引擎运行时,默认为启用脚本模式)http://mail.openjdk.java.net/pipermail/nashorn-dev/2013-December

  • 问题内容: 在每行末尾添加\ n,结束程序正常工作,仅在最后一行工作… 请举个例子,我在任何解决方案中都尝试不了什么,而我发现这里不适合我。 问题答案: 您可以分割最后一个字符: 也许更好的方法是使用字符串库:

  • 问题内容: 如何从静态页面的网址中删除? 另外,我需要将任何网址重定向到没有该网址的网址。(即到)。 问题答案: 感谢您的答复。我已经解决了我的问题。假设我的页面在下,则适用以下.htaccess 规则。

  • 问题内容: 这是一种提交方法: 有可能做下面的事情吗? 我如何从中删除或修改值 问题答案: 除了将项目追加到FormData对象之外,您不能执行任何其他操作。参见规格。如果在实际构造对象之前使用词典/对象存储要添加/修改的所有值,那会更好。