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
无效。下面是激活它的方法:

  • 添加两个VM选项:
    -Djava.security.manager
    -Djava.security.policy=security.policy

  • 在项目的根文件夹中创建一个
    security.policy
    文件,包含以下内容:
    grant{
    权限java.security.AllPermission;
    };


  • 这将为您的项目激活
    SecurityManager
    ,并授予其所有权限。换句话说,它将只激活
    SecurityManager
    ,但您的代码将像以前一样工作。现在,您可以使用上面给出的代码控制部分应用程序的访问控制。

    确实是这样做的,但我看不到您的代码中注册了SecurityManager。您能告诉我如何修复此代码吗?我不知道它怎么了。还有一件事,我的应用程序的其余部分仍然很好。换句话说,我只想将SecurityManager应用于
    引擎.eval行,而不是应用程序的其余部分。谢谢