gpt4 book ai didi

javascript - 内容安全策略随机数不适用于事件处理程序属性

转载 作者:行者123 更新时间:2023-11-30 14:00:28 25 4
gpt4 key购买 nike

我正在将 CSP header 添加到一个网站,该网站在采用严格的政策之前还有很长的路要走。有很多内联脚本,所以我使用 nonce- 来允许特定的内联脚本。我发现它不适用于带有 src 的脚本标记的 onload 属性。这是一个例子:

// header:
Content-Security-Policy: script-src self https: 'nonce-d3adbe3fed'

<script async defer src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js" nonce="d3adbe3fed" onload="console.log('onload', _.VERSION)"></script>

完整的工作演示在 https://brave-pasteur-0d438b.netlify.com/

Chrome 出现以下错误:

Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src self https: 'nonce-d3adbe3fed'". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.

该消息表明应该可以使用 nonce 启用内联事件处理程序,但据我所知,nonce 仅适用于内联脚本。

这只是一个演示,但用例是加载跟踪库的异步/延迟跟踪脚本,然后在 onload 处理程序中对加载的库进行跟踪调用。

是否可以在 onload 或其他事件处理程序属性上使用随机数,或者我是否需要更改我的实现?使用 script-src 'unsafe-inline'script-src-attr 'unsafe-inline' 不是一种选择,因为这些是我专门尝试解决的漏洞.将 onload 处理程序的内容放入脚本标记后的单独脚本中也不是一个选项,因为该脚本是 async deferred,并且需要保持这种状态。

最佳答案

如果有办法在内联处理程序上使用 nonce,我会接受一个证明它的答案。不幸的是,在撰写本文时,我认为还没有。

作为解决方法,以下脚本表现出与具有异步/延迟和加载处理程序的脚本相同的行为和时序,同时满足指定的 CSP 策略:

<script nonce="d3adbe3fed">
let s = document.createElement('script');
s.src = 'https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js';
s.onload = () => console.log(_.VERSION);
document.documentElement.appendChild(s);
</script>

当然,长期的解决方案是完全消除内联脚本,但短期内并不总是可行的,最好快速实现更宽松的政策,而不是推迟实现并且没有 CSP完全没有。

关于javascript - 内容安全策略随机数不适用于事件处理程序属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56399872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com