integrity校验仅对和生效,必须同时配置integrity和crossorigin="anonymous",哈希须基于cdn真实响应体计算,否则静默失效。

integrity 校验只在 <script></script> 和 <link rel="stylesheet"> 上生效
加了 integrity 的 <img>、<iframe></iframe> 或 <link rel="icon"> 完全无效,浏览器直接忽略。它不是通用哈希校验机制,而是 SRI(Subresource Integrity)标准的强制限定——只对跨域加载的 JS 和 CSS 生效。
crossorigin="anonymous" 是硬性前提,漏写等于没开
只写 integrity="sha256-..." 不起作用。浏览器必须走 CORS 流程才能拿到完整响应体来算哈希。常见错误:
- 忘了加
crossorigin属性:浏览器静默跳过校验,控制台零提示 - 写了
crossorigin=""但 CDN 没返回Access-Control-Allow-Origin: *:请求失败或降级为普通跨域请求,SRI 不触发 - 误用
crossorigin="use-credentials"却没配服务端响应头:浏览器拒绝加载,报 CORS 错误而非 SRI 失败
绝大多数公开 CDN(jsDelivr、unpkg、cdnjs)都返回 Access-Control-Allow-Origin: *,所以 crossorigin="anonymous" 就够用。
哈希值必须基于真实 HTTP 响应体生成,不是本地文件
本地 npm install react 下载的 react.min.js,和 CDN 实际返回的内容,哪怕只差一个空格、BOM 或换行符,哈希就完全不同。常见翻车点:
- 用开发版源码生成哈希,但上线用压缩版(含删除注释、重命名变量)
- 构建时自动注入
/* build:20260811 */这类时间戳注释 - CDN 启用了 Brotli 压缩,你却对磁盘上未压缩的文件算哈希(正确做法:对
curl -s https://cdn.../file.js的原始输出算) - Windows 系统保存文件默认带 BOM,导致哈希不一致
最可靠命令:curl -s https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js | openssl dgst -sha384 -binary | openssl base64 -A
校验失败时脚本静默丢弃,控制台只有一条 warning
不匹配时,浏览器不会执行脚本,也不会触发 onerror,页面可能白屏或功能缺失,但控制台只有类似这样的 warning:
Failed to find a valid digest in the 'integrity' attribute for resource 'https://cdn.../vue.global.js' with computed SHA-256 integrity 'Wr5PnkpmZ3oQFRZLfDrI6fsePSMak5h8rW2rqq+mdWg='. The resource has been blocked.
这个 warning 默认是「warning」级别,容易被其他日志淹没;且没有堆栈、不中断执行,极难定位。上线前务必手动改错一个字符测试是否真能拦截——这是最容易被忽略的验证动作。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











