【问题标题】:getAttribute('nonce') works in Firefox, but not ChromegetAttribute('nonce') 适用于 Firefox,但不适用于 Chrome
【发布时间】:2025-11-16 20:05:01
【问题描述】:

鉴于我正在加载这样的脚本:

<script nonce="35609alksdgx30q" src="example.com/main.js"></script>

main.js 内部我需要获取脚本标签上的随机数:

const currentScriptElement = document.currentScript
const nonce = currentScriptElement.getAttribute('nonce')

如果console.log(nonce),我得到两个不同的值:

  • 在 Firefox(最新)中,我得到:35609alksdgx30q 符合预期。
  • 在 Chrome(最新)中,我得到:""(空白字符串),这是我没想到的。

如果我使用实验性随机数属性 (HTMLElement.nonce) 获得随机数,我会得到以下值:

  • 在 Firefox(最新)中,我得到:null 符合预期(因为 Firefox 不支持 nonce 属性)
  • 在 Chrome(最新)中,我得到:35609alksdgx30q 符合预期。

所以为了可靠地获得随机数,我必须这样做:

const nonce = currentScript.nonce || currentScript.getAttribute('nonce') || false

我的问题是,为什么 getAttribute('nonce') 不始终返回 nonce 值?我怀疑这是一个安全问题,但是为什么 Firefox 在使用 @ 时也不返回空字符串987654332@?


是的,从技术上讲,我知道 nonce 用于内联脚本,是的,该脚本已被站点的 CSP 策略清除。由于某些事情的实现方式,我必须以这种方式抓住nonce xD

【问题讨论】:

    标签: javascript security nonce


    【解决方案1】:

    Chrome 正试图阻止人们使用 CSS 属性选择器来泄露 nonce,而 Firefox 则落后于他们的领先地位。

    (如果您打开控制台,您还会注意到 Chrome 已将 DOM 中的完整 nonce 值替换为空的 nonce 属性)。

    请参阅:https://www.chromestatus.com/features/5685968463986688https://bugs.chromium.org/p/chromium/issues/detail?id=680419

    【讨论】: