- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到一个问题,在 nashorn 下运行的一些相当简单的代码正在查找系统属性。查找系统属性失败并显示 AccessControlException
.
我的安全策略已经允许:
grant {
permission java.util.PropertyPermission "*", "read, write";
};
使用 -Djava.security.debug=access,failure
进行调试,我发现CodeSource
是null
对于违规者ProtectionDomain
.
为此,我将断点移至构造函数中,经过几层间接处理后,我最终设法将问题跟踪到 jdk.nashorn.internal.runtime.Source
.
private Source(String name, String base, char[] content, URL url) {
this.name = name;
this.base = base;
this.content = content;
this.length = content.length;
this.url = url;
}
有一个公共(public)构造函数 NashornScriptEngine
正在调用,最终将 url 设置为 null
,这是我看到我的代码通过的构造函数。
public Source(String name, char[] content) {
this(name, baseName(name, (String)null), content, (URL)null);
}
public Source(String name, String content) {
this(name, content.toCharArray());
}
虽然我们确实将脚本作为字符串传递,但它是从 HTML 文件的代码块中提取的,因此理论上我可以为它提供 CodeSource
。然后希望访问控制代码至少能够给予它最低级别的信任,并且查找系统属性应该可以工作。
我看到其他构造函数确实传递 URL。例如:
public Source(String name, URL url, Charset cs) throws IOException {
this(name, baseURL(url, (String)null), readFully(url, cs), url);
}
对于我的一生,我无法弄清楚如何与 ScriptEngine
互动。鼓励 nashorn 引擎调用这些更好的构造函数之一。 ScriptEngine#eval
仅具有采用 String
的方法或Reader
。有没有办法做到这一点?是否有另一种方法可以确保 nashorn 创建代码时正确设置 CodeSource?
我知道它不是什么 - 设置 FILENAME
在脚本上下文中。这似乎完全被忽略了。
奇怪的是,我们也在 JRuby 下运行了所有相同类型的测试,但我们在那里没有看到相同的问题。所以无论这里发生了什么,这一定是纳什霍恩特有的。 (FWIW,我们也从未在 Rhino 下看到过这种情况发生。)
最佳答案
提供CodeSource
是一种安全功能。攻击者可以利用它错误地声称 JS 代码来自特权位置,从而将其放入任何保护域中。 Nashorn 只会将 CodeSource
与它通过 URL 加载的代码相关联(因此可以确定它来自哪里)。即使在 Java 中,将代码与其源关联起来也是只有类加载器才允许执行的操作,因此它受到 createClassLoader
运行时权限的保护。 Its documentation甚至说:
"This is an extremely dangerous permission to grant. Malicious applications that can instantiate their own class loaders could then load their own rogue classes into the system. These newly loaded classes could be placed into any protection domain by the class loader, thereby automatically granting the classes the permissions for that domain."
将“class”替换为“script”,您在这里也有同样的担忧。我可以看到 Nashorn 有一个同时接受 CodeSource
和 char[]
的构造函数,但它必须对 进行权限检查createClassLoader
或新的定制运行时权限。
关于java - 如何为通过 nashorn 评估的脚本提供 CodeSource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29619536/
我遇到一个问题,在 nashorn 下运行的一些相当简单的代码正在查找系统属性。查找系统属性失败并显示 AccessControlException . 我的安全策略已经允许: grant {
我有一个 java 应用程序,一旦导出到可执行 jar,就需要知道它所在的位置。因此,我的代码中有以下函数: private void setLocalJarPaths() throw
我是一名优秀的程序员,十分优秀!