聲明:舊版本的問題令人困惑SecurityManager
和AccessController
。但是現在我知道我犯了一個錯誤,而且這個問題已經完善了。AccessController爲什麼不阻止非特權訪問
莖很直接;我正在尋找一種方法來限制腳本在某些ScriptEngine中可以執行的操作。
我讀過一些類似的新舊問題。似乎有一個解決方案NashornScriptEngine
使用一個名爲ClassFilter
的類。但是我正在尋找一種通用的方式,無論他們的腳本引擎實現如何。有人認爲Java的AccessController
就是這樣。所以我開始閱讀和玩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
這樣做的方法嗎?如果是,那我該怎麼做呢?
明確的方式來做到這一點,但我沒有看到一個SecurityManager正在您的代碼中註冊 –
您能告訴我如何解決這個代碼?我不知道它有什麼問題。還有一件事,我的應用程序的其餘部分是好的。換句話說,我想將SecurityManager應用到'engine.eval'行,而不是應用程序的其餘部分。謝謝。 – Mehran