Javaアプリケーション内でSandbox実行Nashornを実行する方法について明確な回答を得たいと思います。埋め込みNashorn - サンドボックス実行
私は「類似の質問」(私が参照する)を見ましたが、最終的に答えのどれも私の懸念に対処していないようです。
定義から始めましょう。 JavaScriptが有効範囲に追加1以外の任意のJavaオブジェクトにアクセスしてはならないことを保証する「サンドボックス」私が意味することで
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.put("map",new HashMap());
engine.eval(jsCode); // jsCode can access 'map' only.
:
は、私たちがこれを始めるとします。
ですので、次のような証拠が必要です。
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.
だから私は、JavaオブジェクトにアクセスするにはjsCodeを防ぐために、予定のサンドボックス化によってその私は定義しない。
は、私は、これは潜在的な解決策になるかもしれないことを見た:
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" });
私はここに1ことを見た: Safely re-using sandboxed Nashorn containers
は、誰かが私が知っていることはできますか?
"--no-java"は正式には記載されていません。確かにjavadocにはありません。それは安全ですか? – Zo72
@sundararajan将来のバージョンで '--no-java'がサポートされるかどうか、または実験的なものかどうかは教えてください – Zo72
厳密にはjjs -helpで表示されるオプションのみjjsツールとnashornのオプションがサポートされています。しかし、そのようなオプションは削除される可能性は低いです。 –