为什么AccessController没有阻止非特权访问

时间:2016-12-30 02:45:57

标签: java sandbox whitelist securitymanager scriptengine

免责声明:旧版本的问题令SecurityManagerAccessController混淆不清。但现在我知道我犯了一个错误,这个问题很精致。

茎很直接;我正在寻找一种限制脚本在某些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这样做的方法?如果是,那我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

所以我自己设法解决了这个问题。在阅读了一点之后,我发现AccessController如果未激活SecurityManager则无效。以下是您如何激活它:

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

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

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