2017-03-01 6 views
1

Ich möchte eine klare Antwort auf, wie Sandbox Ausführung Nashorn innerhalb einer Java-Anwendung erhalten.eingebettet Nashorn - Sandboxing Ausführung

Ich habe 'ähnliche Fragen' (auf die ich verweisen werde) gesehen, aber letztlich scheint keine der Antworten meine Bedenken zu berücksichtigen.

Lassen Sie mich mit Definitionen beginnen.

Angenommen wir damit beginnen:

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

Mit „Sandbox“ Ich meine, sicherzustellen, dass die JavaScript kein Java-Objekt mit Ausnahme der im Rahmen hinzugefügt eine zugreifen müssen.

so sollten die folgenden evals in Ordnung sein.

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

Aber die folgenden evals werden nicht:

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 

Schließlich bin ich darüber nicht besorgt:

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. 

So von Sandbox Ich beabsichtige jsCode zu verhindern, dass Java-Objekte zuzugreifen, Ich definiere nicht.

sah ich, dass dies eine mögliche Lösung sein könnte:

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; 
    } 

}); 

aber ist es ‚sicher‘ ein Paket mit jdk beginnen zugreifen * direkt.?

Ein weiterer Ansatz sah ich ist noch mysteriöser:

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

ich, dass man hier sah: Safely re-using sandboxed Nashorn containers

Kann mir jemand wissen lassen?

Antwort

0

Sie können jdk.nashorn.api.scripting. * API verwenden, wenn dies in Ihrer Anwendung helfen würde. Javadoc für das gleiche ist hier ->https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/

Und ja, --no-java ist die Option zum Verhindern von Java-Paket-Zugriff von Skript-Code.

+0

aber das "--no-java" ist nicht offiziell dokumentiert. Sicher nicht im Javadoc. Ist es sicher zu tun? – Zo72

+0

@sundararajan jede Chance, mir zu sagen, ob '--no-java' in zukünftigen Versionen unterstützt wird oder ob es nur experimentell ist – Zo72

+0

streng genommen sind nur die von jjs -help angezeigten Optionen Optionen von jjs tool und nashorn. Aber es ist unwahrscheinlich, dass Optionen einfach so entfernt werden. –