CSP 与 SRI 结合可同时保障资源来源可信和内容未被篡改,是防御 CDN 劫持后果的关键防线:SRI 校验完整性,CSP 限制加载与执行,二者缺一不可。

Content Security Policy(CSP)配合子资源完整性(SRI)不能直接阻止 CDN 节点被劫持,但能有效拦截被篡改的资源加载,防止恶意脚本执行,是防御 CDN 劫持后果的关键防线。
为什么 CSP + SRI 是必要组合
CSP 控制哪些外部资源可以加载和执行,SRI 则确保加载的 JS/CSS 文件内容与发布时完全一致。单独用 CSP 无法防止合法域名下被注入的恶意代码;单独用 SRI 无法阻止未加 integrity 属性的资源被替换。两者结合,才能覆盖“资源来源可信”+“资源内容未变”两个维度。
正确配置 SRI 校验
对所有通过 CDN 加载的第三方脚本和样式,必须添加 integrity 和 crossorigin 属性:
- 使用构建工具(如 Webpack、Vite)或在线生成器计算资源的 SHA256/SHA384 摘要,例如:
sha384-oqVuAfXRKap7fdgcCY5uykM6+Rf48zRE0LmF1g8NqF3s7cxBuLw== - HTML 中引用时严格写成:
<script src="https://cdn.example.com/lib.js" integrity="sha384-..." crossorigin="anonymous"></script> - crossorigin 必须设置为 anonymous(即使 CDN 不返回 CORS 头,也需声明;否则浏览器会忽略 integrity 校验)
- 不支持 SRI 的旧浏览器(如 IE)会忽略 integrity 属性,此时依赖 CSP 的 fallback 机制兜底
制定强约束型 CSP 策略
在 HTTP 响应头中设置 Content-Security-Policy,重点限制脚本和样式的加载来源与执行方式:
- 禁止内联脚本和 eval:
script-src 'self' https: 'unsafe-hashes' 'strict-dynamic';(推荐 modern 写法) - 显式列出可信 CDN 域名,并禁用通配符:
script-src 'self' https://cdn.example.com https://cdnjs.cloudflare.com; - 启用 SRI 强制校验:
require-sri-for script style;(该指令会让浏览器拒绝加载任何未带 integrity 的 script/style) - 搭配 report-uri 或 report-to 收集违规行为,便于发现潜在劫持尝试
配套加固建议
仅靠前端策略不够,需与基础设施协同:
- CDN 回源务必使用 HTTPS + IP 直连(绕过 DNS 解析),避免回源链路被 DNS 劫持
- 全站启用 HTTPS,禁用 HTTP 明文跳转,防止中间人篡改 CSP 响应头
- 对关键静态资源做服务端 MD5/SHA 校验(如 Nginx 的
sub_filter配合哈希比对),作为客户端 SRI 的补充 - 定期扫描 HTML 中缺失 integrity 属性的外链资源,自动化补全

















