我正在尝试将nonce值添加到我的内联脚本以满足更严格的CSP。但是,我遇到了一个奇怪的问题,即chrome正在从nonce属性中剥离值。当我卷曲页面时,会出现nonce值。这导致脚本无法执行,因为它现在无法通过CSP测试。我认为这可能是由于流氓扩展,但它在完全干净的chrome版本上失败了。 (OSX上的版本73.0.3683.103)nonce的值是一个随机的256位基本编码字符串,因此它应满足nonce的所有要求。
有谁知道发生了什么事?难道我做错了什么?
问题中描述的行为实际上是预期的行为 - 根据HTML规范要求:
https://html.spec.whatwg.org/multipage/#nonce-attributes:attr-nonce
具有nonce内容属性的元素通过从content属性中提取值,将其移动到名为
[[CryptographicNonce]]
的内部槽中,确保将crytographic nonce仅暴露给脚本(而不是像CSS属性选择器这样的侧通道)。
https://html.spec.whatwg.org/multipage/#nonce-attributes:dom-noncedelement-nonce
...
nonce
IDL属性的setter不会更新相应的content属性。当元素变为浏览上下文连接时,这以及nonce
内容属性的下面设置为空字符串意味着通过可以容易地读取内容属性的机制(例如选择器)来防止nonce值的渗出。
在https://github.com/whatwg/html/pull/2373首次提出之后,在nonce
(“隐藏https://github.com/whatwg/html/issues/2369内容属性值”)的规范更新中添加了此行为。
要明确:规范所要求的行为是,如果通过线路提供的标记源具有以下内容:
<script nonce=DhcnhD3khTMePgXw>...</script>
...然后,如果您打开浏览器devtools并使用DOM检查器,您将看到的是:
<script nonce>...</script>
也就是说,DOM检查器将不会在该nonce
元素上显示script
属性的值。
更准确地说,如果文档是使用nonce
标头提供的,那么script
上的Content-Security-Policy
属性没有任何值,并且浏览器正在该标头中应用策略。
如果您没有使用Content-Security-Policy
标头提供doc,或者浏览器没有应用该策略,您将在检查器中看到nonce=DhcnhD3khTMePgXw
元素的script
。
因此,DOM检查器中缺少nonce
属性的值实际上表明事情正在按预期工作。也就是说,它表示浏览器正在检查nonce-*
标头中任何Content-Security-Policy
源表达式匹配的值。
它在浏览器中的工作方式是,浏览器将nonce
属性的值移动到浏览器自己使用的“内部插槽”。因此它可供浏览器使用,但对DOM是隐藏的。
您在其他浏览器中看不到与Chrome相同的行为的原因是,其他浏览器尚未赶上规范更新并实施了该要求。但是有一些漏洞:
要检查您的浏览器是否符合规范行为,可以在此处使用以下测试:
主流浏览器中的这些测试的当前结果如下: