встроенный Nashorn — исполнение в песочнице

Я хотел бы получить четкий ответ о том, как выполнять песочницу Nashorn в приложении Java.

Я видел «похожие вопросы» (на которые я буду ссылаться), но в конечном итоге ни один из ответов, похоже, не решает моих проблем.

Начну с определений.

Предположим, мы начинаем с этого:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.put("map",new HashMap()); 
engine.eval(jsCode); // jsCode can access 'map' only.

Под «песочницей» я подразумеваю, что JavaScript не должен обращаться ни к какому объекту Java, кроме того, который добавлен в область.

поэтому следующие оценки должны быть в порядке.

engine.eval("map.toString()"); 
engine.eval("map.size()"); 
engine.eval("map.put('name','jeff'); "); 
engine.eval("map.getClass()"); 

Но следующие оценки не будут:

engine.eval("var m = new java.util.HashMap();"); // <-- stop accessing Java
engine.eval("map.getClass().forName('java.io.File'); "); // stop. it's trying to be sneaky

Наконец, я не беспокоюсь об этом:

engine.eval("while(1) {;}"); // this is impossible to detect. Maybe it's possible for this simple case... but sneaky users could make it impossible to detect... anyway this is not what I am asking. I am only concerned on accessing java objects.

Поэтому с помощью песочницы я намерен предотвратить доступ jsCode к объектам Java, которые я не определяю.

Я увидел, что это может быть потенциальным решением:

jdk.nashorn.api.scripting.NashornScriptEngineFactory factory = new  jdk.nashorn.api.scripting.NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine(new jdk.nashorn.api.scripting.ClassFilter() {

    public boolean exposeToScripts(String s) {
        return false;
    }

});

но «безопасно» ли напрямую обращаться к пакету, начинающемуся с jdk.*?

Другой подход, который я видел, еще более загадочен:

final ScriptEngine engine = 
   new NashornScriptEngineFactory().getScriptEngine(new String[] { "--no-java" }); 

Я видел это здесь: Безопасное повторное использование изолированных контейнеров Nashorn

Может кто-нибудь сообщить мне?


person Zo72    schedule 01.03.2017    source источник


Ответы (1)


Вы можете использовать jdk.nashorn.api.scripting.* API, если это поможет вашему приложению. javadoc для того же находится здесь -> https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/

И да, --no-java — это опция для предотвращения доступа к пакету Java из кода скрипта.

person A. Sundararajan    schedule 02.03.2017
comment
но это --no-java официально не задокументировано. Конечно, не в javadoc. Безопасно ли это делать? - person Zo72; 02.03.2017
comment
@sundararajan есть шанс сказать мне, будет ли поддержка --no-java в будущих версиях или это только экспериментальная версия - person Zo72; 07.03.2017
comment
Строго говоря, только параметры, отображаемые jjs -help, являются поддерживаемыми параметрами инструмента jjs и nashorn. Но вряд ли опции удаляются просто так. - person A. Sundararajan; 10.03.2017
comment
хорошо, большое спасибо, тогда я не буду использовать его. Такое ощущение, что проблемы безопасности не были должным образом решены в nashorn. - person Zo72; 10.03.2017
comment
Я не согласен с этим утверждением. Устранены проблемы безопасности. Если вы работаете с SecurityManager, все оцениваемые сценарии находятся в песочнице. Ваша политика безопасности может предоставить разрешения только сценариям, загруженным с определенных URL-адресов. Фильтрация классов — это отдельная тема, не связанная с безопасностью. - person A. Sundararajan; 10.03.2017
comment
См. также wiki.openjdk.java.net/display/Nashorn / - person A. Sundararajan; 10.03.2017
comment
Помимо запуска с включенным диспетчером безопасности, вы можете фильтровать определенные классы для сценариев с помощью ClassFilter ( docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/ ). Да jdk.nashorn.api.scripting.* — это опубликованный API. - person A. Sundararajan; 10.03.2017
comment
Действительно спасибо. Я хотел сказать, что вопросы безопасности официально не рассматриваются. Я ненавижу переходить непосредственно к пакетам jdk.*. У меня был еще один вопрос, где я спросил, могу ли я получить доступ к jdk. *, и ответ был единодушным «нет». Спасибо за вашу помощь. - person Zo72; 10.03.2017