Java 为什么AccessController不阻止非特权访问
免责声明:该问题的旧版本混淆了Java 为什么AccessController不阻止非特权访问,java,sandbox,whitelist,securitymanager,scriptengine,Java,Sandbox,Whitelist,Securitymanager,Scriptengine,免责声明:该问题的旧版本混淆了SecurityManager和AccessController。但现在我知道我犯了一个错误,这个问题变得更加精确了 茎很直;我正在寻找一种方法来限制脚本在某些脚本引擎中的功能 我读过一些类似的问题,新旧的。使用名为ClassFilter的类似乎可以解决NashornScriptEngine。但是我正在寻找一种通用的方法,不管它们的脚本引擎实现如何。有人认为Java的AccessController就是一种方法。因此,我开始阅读并使用AccessController
SecurityManager
和AccessController
。但现在我知道我犯了一个错误,这个问题变得更加精确了
茎很直;我正在寻找一种方法来限制脚本在某些脚本引擎中的功能
我读过一些类似的问题,新旧的。使用名为ClassFilter
的类似乎可以解决NashornScriptEngine
。但是我正在寻找一种通用的方法,不管它们的脚本引擎实现如何。有人认为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
,则AccessController
无效。下面是激活它的方法:
-Djava.security.manager
-Djava.security.policy=security.policy
security.policy
文件,包含以下内容:
grant{
权限java.security.AllPermission;
};代码>
这将为您的项目激活
SecurityManager
,并授予其所有权限。换句话说,它将只激活SecurityManager
,但您的代码将像以前一样工作。现在,您可以使用上面给出的代码控制部分应用程序的访问控制。确实是这样做的,但我看不到您的代码中注册了SecurityManager。您能告诉我如何修复此代码吗?我不知道它怎么了。还有一件事,我的应用程序的其余部分仍然很好。换句话说,我只想将SecurityManager应用于引擎.eval行,而不是应用程序的其余部分。谢谢