鉴于我正在加载这样的脚本:
<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')
不能始终如一地返回随机数值?我怀疑这是一个安全的事情,但是为什么Firefox在使用getAttribute('nonce')
时不返回一个空字符串呢?
是的,我知道从技术上讲nonce
用于内联脚本,是的,该脚本已由站点的 CSP 策略清除。由于某些事情是如何实现的,我必须以这种方式抓住nonce
xD
Chrome 正试图阻止人们使用 CSS 属性选择器来窃取随机数,而 Firefox 在跟随他们的领导方面落后了。
(如果您打开控制台,您还会注意到 Chrome 已将 DOM 中的完整 nonce 值替换为空的nonce
属性(。
请参阅:https://www.chromestatus.com/features/5685968463986688,https://bugs.chromium.org/p/chromium/issues/detail?id=680419