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

时间:2019-04-14 00:20:16

标签: google-chrome content-security-policy nonce

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

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

1 个答案:

答案 0 :(得分:1)

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

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

  

具有随机数内容属性的元素可通过从内容属性中提取值并将其移至名为{{的内部插槽中,以确保仅将脚本随机数暴露给脚本(而不暴露于CSS属性选择器之类的旁通道)。 1}}

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

  

[[CryptographicNonce]] IDL属性的设置器不会更新相应的内容属性。这以及在元素变为浏览上下文连接时将nonce内容属性设置为空字符串的以下内容,旨在防止通过易于读取内容属性的机制(例如,选择器。

此行为是在https://github.com/whatwg/html/pull/2373中提出之后在https://github.com/whatwg/html/issues/2369规范的更新中添加的(“隐藏nonce内容属性值” )。 / p>

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

nonce

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

<script nonce=DhcnhD3khTMePgXw>...</script>

也就是说,DOM检查器不会在该<script nonce>...</script> 元素上显示nonce属性的值。

更准确地说,如果文档带有script标头,并且浏览器正在应用该策略,那么您将看不到该noncescript属性的值在该标题中。

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

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

浏览器内部的工作方式是,浏览器将Content-Security-Policy属性的值移动到“内部插槽”供浏览器自己使用。因此,它仍然可供浏览器使用,但对DOM隐藏。

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


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

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