CSP报告中status 200状态码的含义及Edge特定情况咨询
CSP报告中status-code 200的含义及Edge 18的特殊情况
先直接拆解核心:CSP报告里的status-code字段,指的是被浏览器拦截的那个资源本身的HTTP响应状态码,并不是CSP报告发送到你服务器时的状态码。
在你的案例里,被拦截的脚本https://redacted.com/static/js/browser.polyfill.min.js?etag=dp1dNqwV其实已经被服务器成功返回了(HTTP 200状态),但因为它不符合你的CSP策略,所以浏览器还是拒绝加载它,同时把这个拦截事件记录在CSP报告里。
为什么只有Edge 18会触发这个报告?
问题出在你的CSP策略里的'strict-dynamic'指令——这是CSP 3的新特性,但基于EdgeHTML引擎的旧版Edge 18完全不支持它。
当浏览器不认识'strict-dynamic'时,会直接忽略这个指令,然后按照CSP 2的规则校验脚本:
- 你的
script-src里只列出了一堆nonce值和'unsafe-inline',但这个polyfill脚本没有携带任何一个合法的nonce - 你也没有在
script-src里添加'self'这类允许源的规则(因为strict-dynamic本来会允许可信脚本加载的后续脚本,但Edge 18不认这个逻辑) - 所以Edge 18判定这个脚本违反了CSP,触发了报告
而其他现代浏览器支持strict-dynamic:如果这个polyfill是由你页面上带有合法nonce的脚本加载的,strict-dynamic会自动允许它执行,自然不会触发报告。
兼容Edge 18的修复方案
如果你需要支持这个旧版本浏览器,可以在script-src里添加'self'作为 fallback:
script-src 'self' 'strict-dynamic' 'unsafe-inline' 'nonce-M2EyZTVhMzItNDY5My00YTI5LWE3MzEtM2NjMjdjMjc0ZmQ0' [你的其他nonce值...]
这样,当Edge 18忽略strict-dynamic后,会允许同域的脚本加载,就不会再触发这个报告了。当然,添加'self'会稍微降低一点安全性,但这是兼容旧浏览器的合理权衡。
内容的提问来源于stack exchange,提问作者Jezen Thomas
相关产品推荐
相关产品推荐

