Я хотел бы получить четкий ответ о том, как выполнять песочницу 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
Может кто-нибудь сообщить мне?