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