2017-03-01 1 views
1

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?

Répondre

0

Vous pouvez utiliser jdk.nashorn.api.scripting. * API si cela peut vous aider dans votre application. javadoc pour le même est ici ->https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/

Et oui, --no-java est l'option pour empêcher l'accès au paquet java du code de script.

+0

mais que "--no-java" n'est pas officiellement documenté. Certainement pas dans le javadoc. Est-il sécuritaire de faire? – Zo72

+0

@sundararajan une chance de me dire si '--no-java' sera supporté dans les futures versions ou s'il est expérimental seulement – Zo72

+0

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. –