CSP设置后图片资源被阻止,如何排查?
最近给项目加CSP头时发现图片加载失败,控制台提示”Blocked … source of ‘http://…’ isn’t listed”。我试过在标签用nonce和在CSP头添加,但问题依旧存在。
当前CSP头配置是这样的:
Content-Security-Policy: default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self';
但请求的图片路径明明是相对地址,为什么还是被拦截?另外第三方CDN的图片该怎么正确配置?求大神指点具体排查步骤…
Content-Security-Policy: default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' https://your-cdn-domain.com;
第三方CDN图片就在img-src后面追加对应域名,多个用空格隔开。记得清除缓存再测,别问我怎么知道的。就这样。
第一步先打开浏览器开发者工具,看 Network 面板里图片请求的实际响应头是不是真的带上了你设的 CSP。有时候中间件、CDN 或反向代理会覆盖或修改头部,你自己写的策略根本没生效。
第二步检查图片实际请求的域名。比如你以为是 /static/logo.png,但如果页面在 https://a.example.com 下,而图片请求发到了 http://a.example.com(注意是 http),那就算同域名,协议不同也会被 'self' 拦掉。'self' 严格匹配协议+主机+端口。
第三,如果用了内联 data:image 的图片,比如
第四,第三方 CDN 图片的话,在 img-src 后面加上对应域名就行。比如:
注意要用 https,别用 http,除非真要支持 http(不推荐)。也可以临时加 unsafe-eval 和 unsafe-inline 做测试,确认是不是 CSP 导致的问题,但上线前必须去掉。
最后建议开发环境先用 Content-Security-Policy-Report-Only 头来试,收集报错日志而不真正阻断,避免直接干掉正常功能。等报告稳定了再切到正式策略。