Je voudrais obtenir une réponse claire sur la façon d'exécuter Sandbox Nashorn dans une application Java.embarqué Nashorn - exécution sandboxing
J'ai vu des 'questions similaires' (auxquelles je me référerai) mais finalement aucune des réponses ne semble répondre à mes préoccupations. Permettez-moi de commencer par les définitions.
Supposons que nous commençons par ceci:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.put("map",new HashMap());
engine.eval(jsCode); // jsCode can access 'map' only.
Par « sandboxing » Je veux dire faire en sorte que le JavaScript ne doit pas accéder à un objet java, sauf celui ajouté dans le champ d'application.
donc les évaluations suivantes devraient être bien.
engine.eval("map.toString()");
engine.eval("map.size()");
engine.eval("map.put('name','jeff'); ");
engine.eval("map.getClass()");
Mais les evals suivants ne seront pas:
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
Enfin, je ne suis pas préoccupé par ceci:
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.
Alors par sandboxing J'ai l'intention d'empêcher codeJS d'accéder aux objets java qui Je ne définis pas.
j'ai vu que cela pourrait être une solution potentielle:
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;
}
});
mais est-il « sûr » pour accéder à un paquet commençant par * jdk directement.?
Une autre approche que j'ai vu est encore plus mystérieuse:
final ScriptEngine engine =
new NashornScriptEngineFactory().getScriptEngine(new String[] { "--no-java" });
je vis que l'on est ici: Safely re-using sandboxed Nashorn containers
quelqu'un peut me le faire savoir?
mais que "--no-java" n'est pas officiellement documenté. Certainement pas dans le javadoc. Est-il sécuritaire de faire? – Zo72
@sundararajan une chance de me dire si '--no-java' sera supporté dans les futures versions ou s'il est expérimental seulement – Zo72
strictement parlant seulement les options affichées par jjs -help sont les options supportées de jjs tool et nashorn. Mais, il est peu probable que les options soient supprimées comme ça. –