Как удалить java api из Nashorn-engine?

#java #javascript #nashorn

#java #javascript #nashorn

Вопрос:

Можно ли скрыть или удалить java API из nashorn-engine? Чтобы он мог видеть или использовать только «default» ECMAScript 262 версии 5.1 с некоторыми особенно открытыми функциями / переменными?

Я хотел бы позволить моим конечным пользователям создавать какую-то конкретную логику для своих собственных, не беспокоясь о том, что они могут взломать всю систему. Конечно, в движке nashorn могут быть некоторые дыры в безопасности и т. Д., Но это другая тема.

Редактировать: Извините, я забыл упомянуть, что я запускаю nashorn внутри своего java-приложения, поэтому параметры командной строки не могут использоваться.

Ответ №1:

Программно вы также можете напрямую использовать NashornScriptEngineFactory класс, который имеет соответствующий метод getScriptEngine():

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

Ответ №2:

Хорошо, вот пример класса с некоторыми ограничивающими аргументами:

 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 оставляет желать лучшего)

Ответ №3:

Вы можете указать любую опцию jjs для скриптовых движков с помощью опции -Dnashorn.args при запуске вашей Java-программы. Например:

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

где Main использует javax.script API с движком nashorn.

Комментарии:

1. есть ли способ сделать это программно? Об этом можно забыть, и результаты могут быть плохими. Я совершенно забыл: Properties props = System.GetProperties(); props.setProperty(«nashorn.args», «-strict —no-java —no-syntax-extensions»);

Ответ №4:

Вы можете запустить инструмент «jjs» с параметром —no-java, чтобы предотвратить любой явный доступ к пакету / классу Java из скриптов. Тем не менее, платформа Nashorn безопасна и использует стандартную модель безопасности на основе кодовой базы URL-адресов Java («оцененный» скрипт без известного источника URL-адреса обрабатывается как ненадежный, неподписанный код и поэтому получает только разрешения для изолированной среды.

Комментарии:

1. спасибо, но я думаю, что этот флаг не используется, когда вы включаете nashorn в свое java-приложение

Ответ №5:

—no-java является основным флагом для отключения расширений java. —no-syntax-extensions отключает нестандартные расширения.

Комментарии:

1. спасибо, но я думаю, что этот флаг не используется, когда вы включаете nashorn в свое java-приложение