加了 CSP 并给内联脚本配 nonce 首页第一遍正常 刷新几次就报 Refused to execute inline script because it violates script-src 换台没缓存的手机打开又是好的 响应头里的值每次都不同。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

curl -sI https://e.com | grep -i content-security-policy
curl -s https://e.com | grep -c 'nonce='

整页被缓存或者 CDN 缓存了 写死在 HTML 里的 nonce 没变 而响应头的策略每次重新生成 两边对不上 校验必然失败 缓存和随机值天生冲突。这一点先确认清楚,后面就不用反复试。

「CSP nonce 缓存」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,带 nonce 的页面从整页缓存里排除 或者改成按请求生成;退一步用 hash 白名单 内联内容固定就不受缓存影响;别为省事回退到 unsafe-inline 那等于把整条策略关掉 白忙一场。

改完照着核一遍,连续刷新十次内联脚本都执行 源码里的 nonce 每次都不一样 报表也正常。

作者 9823189