免責事項:質問の古いバージョンは、SecurityManager
とAccessController
を混同していました。しかし、今私は間違いを犯したことを知っており、問題は洗練されています。AccessControllerが非特権アクセスをブロックしていない理由
茎はかなりストレートです。私はいくつかのScriptEngineでスクリプトができることを制限する方法を探しています。
私はいくつかの同様の質問、古いと新しいを読んだ。 ClassFilter
というクラスを使用したNashornScriptEngine
の解決策があるようです。しかし、私は、スクリプトエンジンの実装に関係なく一般的な方法を探しています。いくつかは、JavaのAccessController
が方法であることを示唆しています。
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
Permissions perms = new Permissions();
ProtectionDomain domain = new ProtectionDomain(new CodeSource(null, (Certificate[]) null), perms);
AccessControlContext acc = new AccessControlContext(new ProtectionDomain[] { domain });
AccessController.doPrivileged(new PrivilegedAction() {
@Override
public Object run() {
try {
//I want the following line to throw a SecurityException
return engine.eval("var System = Java.type('java.lang.System'); print(System.getProperty('java.home'));");
}
catch (ScriptException e) {
e.printStackTrace();
}
return null;
}},
acc
);
//At the same time I want the following line to work
System.out.println(System.getProperty("java.home"));
そして関与なしAccessControllerのはありませんかのようにスクリプトが実行されます。だから私は、これまでのところ、私はこれを持って、読んで、AccessController
と遊ぶために始めました!
私の質問です。これを行う方法はAccessController
ですか?それがあれば、どうすればいいのですか?
確実に行う方法ですが、コードにSecurityManagerが登録されていないと表示されます –
このコードを修正する方法を教えてください。私は何が間違っているのか分からない。もう1つ、私のアプリケーションの残りの部分はそのままです。言い換えれば、SecurityManagerを適用したいのは、アプリケーションの残りの部分ではなく、 'engine.eval'行です。ありがとう。 – Mehran