任何支持脚本随机数的浏览器?

信息安全 网页浏览器
2021-09-06 04:23:09

我试图在我的 html 文件中包含 script-nonce,但似乎当前的浏览器都不支持它。

有人知道支持此功能的任何浏览器版本吗?我目前正在使用 Chrome 版本 26.0.1410.63 并且也尝试过版本 28,但它似乎不起作用

可以在此处找到带有脚本随机数的示例 html 文件

我所看到的只是 javascript 控制台上的错误,它暗示浏览器尚不支持 script-nonce:

Unrecognized Content-Security-Policy directive 'script-nonce'
3个回答

它也适用于 Chrome,但到目前为止(版本 26.0.1410.64 m)仅使用临时X-Content-Security-Policy而不是Content-Security-Policy标题,如已更新的代码示例中所定义。W3C Web 应用程序安全工作组刚刚于 2013 年 4 月 28 日将内容安全策略 1.1从之前的工作组草案移至W3C 编辑草案状态那有什么机会,嗯?

我猜谷歌代码在几天前就已经更新了代码示例,我希望下一次 Chrome 更新会相应地改变这一点。

无论如何,该解决方案隐藏在Google 的 CSP 1.1 先前草稿版本的缓存副本的细则中:

本文档描述了一项已被更广泛的社区讨论了大约两年的提案。在 Firefox 和 Chrome 中有实验性的实现,分别使用标头名称 X-Content-Security-PolicyX-WebKit-CSPInternet Explorer 10 平台预览版还包含部分实现,使用标题名称X-Content-Security-Policy

如果我们再次检查Google 代码示例,这些标头值的差异变得非常明显:

<meta http-equiv="Content-Security-Policy" content="script-nonce noncynonce;">

因此,看起来您所要做的(暂时,直到 Chrome 更新以反映 CSP 1.1 提案的状态更改)是将标头名称更改回X-Content-Security-Policy.

我还在最新的 Firefox 和 Opera 浏览器上测试了这些示例,它们已经接受Content-Security-Policy并且没有抱怨控制台错误。

是的。

看起来script-nonce已从规范中删除,而script-src 'nonce-ABCD4321';应该是新语法。据我所知,Chrome 32 不支持新语法,但 Chrome 33 Beta 支持。

参见http://jsbin.com/iyukAwA/3示例测试页面。

EDIT1:看起来像 Blink 补丁https://chromium.googlesource.com/chromium/blink/+/adbf3bb0338931076b7c7bd002b043def760cc61 删除script-nonce支持并添加script-src 'nonce-xxx';支持。

EDIT3:最新规格

EDIT2:我绝对需要内联脚本和 css,因为我的 web 应用程序有页面内代码来检测包含的脚本或 css 源文件是否无法加载(例如,由于移动连接不可靠)。在 Chrome 中,动态创建元元素:

<script>
var meta = document.createElement('meta');
meta.httpEquiv = 'Content-Security-Policy';
meta.content = "default-src 'none'; connect-src 'self'; img-src 'self'; style-src 'self';";
document.getElementsByTagName('head')[0].appendChild(meta);
</script>
</head>

来自内容安全政策 1.1 - W3C 工作草案 2013 年 6 月 4 日

示例 4:依赖内联脚本元素的网站希望确保脚本仅从其自身来源执行,并且它有意插入内联的那些元素:

Content-Security-Policy: script-src 'self' 'nonce-$RANDOM';

内联脚本元素只有在它们包含匹配的 nonce 属性时才会执行:

<script nonce="$RANDOM">...</script>

EDIT5: http: //jsbin.com/ArusOCu/1有 document.onsecuritypolicyviolation(event) 日志记录的示例。例如

document.onsecuritypolicyviolation = function (evt) {
    console.log('Bzzp! Security violation on', evt.documentURI);
}

EDIT5 - 更多:Chrome 33 Beta 生成了以下事件详细信息:

blockedURI: ""
columnNumber: 0
currentTarget: document
documentURI: "http://jsbin.com/ArusOCu/1"
effectiveDirective: "script-src"
lineNumber: 0
originalPolicy: "default-src 'none'; script-src http://static.jsbin.com 'unsafe-eval' 'nonce-12345678'; connect-src 'self'; style-src http: 'unsafe-inline';"
referrer: ""
sourceFile: ""
statusCode: 200
target: document
timeStamp: 1390192192606
type: "securitypolicyviolation"
violatedDirective: "script-src http://static.jsbin.com 'unsafe-eval' 'nonce-12345678'"
__proto__: SecurityPolicyViolationEvent
[removed base Event parameters]

并且文档说需要以下属性:

readonly attribute DOMString documentURI;
readonly attribute DOMString referrer;
readonly attribute DOMString blockedURI;
readonly attribute DOMString violatedDirective;
readonly attribute DOMString effectiveDirective;
readonly attribute DOMString originalPolicy;
readonly attribute DOMString sourceFile;
readonly attribute long      lineNumber;
readonly attribute long      columnNumber;

Tidalwave 给出了一个很好的答案。

但是,在 chrome://flags 上启用“Experimental Webkit Features”后,您可以在 Chrome 版本 28.0.1490.2 dev 上运行它。这样,您无需任何修改即可使用此语法。

我从 Chromium 上此功能的开发人员那里得到了这个答案,他警告说将来语法可能会改变。