#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-приложение