【发布时间】:2017-05-14 09:12:18
【问题描述】:
免责声明:旧版本的问题混淆了SecurityManager 和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行,而不是应用程序的其余部分。谢谢。
标签: java sandbox whitelist securitymanager scriptengine