integrity属性未生效的主因是未与crossorigin="anonymous"成对配置,且哈希值未基于真实CDN响应体计算;仅script和link[rel=stylesheet]支持,浏览器在非CORS模式下静默跳过校验。

加了 integrity 属性但没拦住 CDN 劫持?大概率不是属性没用,而是它根本没生效——浏览器压根没校验。
为什么 integrity 单独写在 <script> 里等于没加
integrity 必须和 crossorigin 成对出现,缺一不可。浏览器只在 CORS 模式下才读取响应体来算哈希,否则直接跳过校验,且控制台零提示。
-
crossorigin="anonymous"是绝大多数公开 CDN(如 jsDelivr、unpkg)的唯一正确取值;写成crossorigin="true"或漏掉,integrity就是纯装饰 - 模块脚本(
type="module")默认走 CORS,所以即使没显式写crossorigin,integrity也会生效——但非模块脚本必须手动加 - 如果 CDN 响应头没返回
Access-Control-Allow-Origin: *(比如某些私有镜像或老旧站),加了crossorigin反而会让请求失败,资源彻底加载不了
哈希值必须从真实 CDN 响应体生成,不是本地文件
本地 npm install 下来的 vue.global.js 和 CDN 实际返回的内容,哪怕只差一个 BOM 字节或换行符,哈希就完全不匹配。
- 可靠命令:
curl -sL https://cdn.jsdelivr.net/npm/vue@3.4.21/dist/vue.global.js | openssl dgst -sha384 -binary | openssl base64 -A -
-sL不可省:静默 + 跟重定向,否则可能哈希的是 302 响应体 - 不用解压参数:
curl默认自动处理 gzip/Brotli,返回的就是浏览器实际收到的解压后字节 - 算法只认
sha256-、sha384-、sha512-前缀,大小写敏感,SHA384-或sha384:都无效
常见翻车现象和对应排查点
页面白屏、功能缺失,Network 面板显示 JS 状态是 200,控制台却只有 Failed to find a valid digest in the 'integrity' attribute —— 这不是网络问题,是 SRI 在起作用,但配置错了。
立即学习“前端免费学习笔记(深入)”;
- 检查 DOM 中该
<script>标签是否真有crossorigin="anonymous",别信编辑器高亮或构建后模板变量没展开 - 用
curl -I看 CDN URL 响应头是否含access-control-allow-origin,不含就换 CDN 或加代理层补头 - 构建流程中若自动注入 runtime chunk 或动态拼接 script 标签,这些标签往往漏掉
integrity,得单独处理 - 本地用
file://打开 HTML 时,integrity全部被禁用,必须走http://localhost或 HTTPS 环境测试
真正难的不是加属性,而是确保每次上线的哈希都绑定到那个精确字节流——构建工具差异、CDN 压缩策略、BOM 插入、甚至 Node.js 版本导致的 base64 编码微小偏差,都会让哈希漂移。别依赖一次生成长期复用,把它当成构建流水线里必须跑通的一环。



















