Google Chrome从脚本标记中剥离现时值

tom*_*opp 4 google-chrome nonce content-security-policy

我正在尝试将nonce值添加到内联脚本中以满足更严格的CSP。但是,我遇到了一个奇怪的问题,即chrome正在从现时属性中剥离值。当我卷曲页面时,会出现现时值。这导致脚本现在无法通过CSP测试,因此无法执行。我以为这可能是由于流氓扩展引起的,但是在完全干净的chrome版本上却失败了。(OSX上的版本73.0.3683.103)随机数的值是一个随机的256位基本编码的字符串,因此它应满足随机数的所有要求。

有人知道发生了什么吗?难道我做错了什么?

sid*_*ker 5

问题中描述的行为实际上是预期的行为-根据HTML规范要求:

https://html.spec.whatwg.org/multipage/#nonce-attributes:attr-nonce

具有nonce内容属性的元素可通过从content属性中提取值并将其移至名为内部的槽中,从而确保仅将脚本随机数暴露给脚本(而不暴露于CSS属性选择器之类的副渠道)。 [[CryptographicNonce]]

https://html.spec.whatwg.org/multipage/#nonce-attributes:dom-noncedelement-nonce

nonceIDL属性的设置器不会更新相应的content属性。这以及nonce在元素成为浏览上下文连接时,将内容属性设置为空字符串的以下内容,旨在防止通过容易读取内容属性的机制(例如选择器)使现时值泄漏。

在首次在https://github.com/whatwg/html/中提出后,此行为已添加到https://github.com/whatwg/html/pull/2373规范的更新中(“隐藏nonce内容属性值”)。问题/ 2369

需要明确的是:规范要求的行为是,如果您通过网络提供的标记源具有以下特征:

<script nonce=DhcnhD3khTMePgXw>...</script>
Run Code Online (Sandbox Code Playgroud)

…然后,如果您打开浏览器devtools并使用DOM检查器,您将看到的是:

<script nonce>...</script>
Run Code Online (Sandbox Code Playgroud)

也就是说,DOM检查器将nonce对该script元素上的属性不显示任何值。

更准确地说,如果文档带有标头,并且浏览器正在该标头中应用该策略noncescript则该属性将没有任何价值Content-Security-Policy

如果您没有为文档提供Content-Security-Policy标题,或者浏览器没有从中应用该策略,则会在检查器中看到nonce=DhcnhD3khTMePgXwscript元素。

因此,nonceDOM检查器中缺少该属性的值实际上表明事情正在按预期进行。也就是说,它表示浏览器正在检查nonce-*Content-Security-Policy标题中的任何源表达式匹配的值。

它在浏览器内部的工作方式是,浏览器将nonce属性的值移动到“内部插槽”供浏览器自己使用。因此它对浏览器保持可用,但对DOM隐藏。

您尚未在其他浏览器中看到与Chrome相同的行为的原因是,其他浏览器尚未赶上规范更新并实现了要求。但是有一些开放的错误:


要检查您的浏览器是否符合规范行为,可以在此处使用测试:

在主要浏览器中这些测试的当前结果在这里:

  • 迈克,感谢您花时间澄清规范的行为。(以及您与 w3c 的合作)也许您可以利用您的职位游说浏览器供应商,向开发人员提供一些反馈,表明事情正在按预期进行。我认为随机数旁边的绿色复选标记或其他一些视觉标记将有助于表明事情正在按预期进行。我理解这种设计背后的基本原理,但由于没有其他浏览器 API 具有这样的行为,我认为这将有助于在测试不同浏览器时避免进一步的混乱。 (3认同)