Google Chrome从脚本标签中剥离nonce值

31
我试图给我的内联脚本添加随机号码以满足更严格的CSP。然而,我遇到了一个奇怪的问题,Chrome会从nonce属性中去除值。当我curl页面时,nonce值是存在的。这导致脚本无法执行,因为它现在未通过CSP测试。我认为这可能是由于流氓扩展引起的,但它在完全干净的Chrome版本上失败。(OSX上的版本73.0.3683.103) nonce的值是一个随机的256位基础编码字符串,因此应该满足nonce的所有要求。请问有人知道发生了什么吗?我做错了什么吗?
1个回答

59
在问题中描述的行为实际上是期望的行为 - 根据HTML规范所需:https://html.spec.whatwg.org/multipage/#nonce-attributes:attr-nonce。具有一次性内容属性的元素通过从内容属性中提取值并将其移动到名为[[CryptographicNonce]]的内部插槽中,确保加密随机数仅向脚本公开(而不是CSS属性选择器等侧通道)。 https://html.spec.whatwg.org/multipage/#nonce-attributes:dom-noncedelement-nonce。 非ce:nonce IDL属性的setter不会更新相应的内容属性。 这以及当元素成为浏览上下文连接时将nonce内容属性设置为空字符串的操作,旨在防止通过可以轻松读取内容属性(例如选择器)的机制泄露nonce值。 这个行为是在规范的更新中添加的https://github.com/whatwg/html/pull/2373(隐藏nonce内容属性值); 请参见https://github.com/whatwg/html/issues/2369。 明确一点:规范要求的行为是,如果您通过电线提供的标记源具有:
<script nonce=DhcnhD3khTMePgXw>...</script>

接着,如果您打开浏览器的开发者工具并使用DOM检查器,您将看到以下内容:

<script nonce>...</script>
也就是说,如果文档使用了 Content-Security-Policy 头部并且浏览器应用了该头部中的策略,则 DOM 检查器将不会显示该 script 元素上 nonce 属性的任何值。更准确地说,如果文档带有 Content-Security-Policy 头部并且浏览器正在应用其中的策略,那么您将看不到该 script 上的 nonce 属性的任何值。如果不使用 Content-Security-Policy 头或浏览器不应用其策略,则在检查器中可以看到 script 元素的 nonce=DhcnhD3khTMePgXw 值。因此,在 DOM 检查器中缺少该 nonce 属性的值实际上表明事情正在按预期工作。也就是说,它指示浏览器正在将该值与 Content-Security-Policy 头中的任何 nonce-* 源表达式进行匹配。浏览器内部的工作方式是:将 nonce 属性的值移动到浏览器自己的“内部槽”中以供浏览器自己使用。因此,它仍然对浏览器可用,但是对 DOM 隐藏。 https://wpt.fyi/results/content-security-policy/nonce-hiding 显示所有当前的浏览器引擎都符合这一规范。

3
Mike,感谢您抽出时间来澄清规范的行为(以及您与w3c的合作)。也许您可以利用自己的地位游说浏览器供应商向开发人员提供反馈,以确保事情按预期进行。我认为在nonce旁边添加一个绿色勾号或其他视觉标记会有所帮助,以指示事情正在按预期进行。我理解它被设计成这样的原因,但由于没有其他浏览器API的行为类似,所以我认为在测试不同的浏览器时,这将有助于避免进一步的混淆。 - tomciopp
非常清晰明了,正是我想要了解的内容。但是@tomciopp,虽然它解释了为什么源代码中缺少nonce,但你是否成功解决了CSP问题?如果这发生得太久远,对不起,可能已经不再是问题了。 - Jarrod McGuire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接