integrity属性是<script>和<link>标签上启用子资源完整性(SRI)校验的安全机制,必须配合crossorigin使用,浏览器仅对跨域外部JS/CSS资源执行哈希比对,不匹配则静默拒绝加载。

integrity 属性是 <script> 和 <link> 标签上用于启用子资源完整性(SRI)校验的安全机制。它不是“可有可无的装饰”,而是防止 CDN 被劫持或中间人篡改资源的关键防线——只要哈希不匹配,浏览器会直接拒绝加载该资源,连错误回调都不会触发。
integrity 必须配合 crossorigin 才生效
单独写 <script src="https://cdn.example/jquery.js" integrity="sha384-..."></script> 是无效的。浏览器只在校验跨域请求时才检查 integrity,所以必须显式声明 crossorigin:
-
crossorigin="anonymous":最常用,不带凭据(cookies、HTTP auth),对应 CDN 静态资源 -
crossorigin="use-credentials":需携带凭据,极少用,且要求服务端返回Access-Control-Allow-Origin: *或明确域名 +Access-Control-Allow-Credentials: true - 漏掉
crossorigin会导致 integrity 被完全忽略,且控制台无任何警告
哈希值必须基于最终上线文件生成
本地开发时用 npm install jquery 下载的 jquery.min.js,和你最终部署到 CDN 上的文件,哪怕只差一个空格,哈希就完全不同。常见翻车点:
- 用开发版文件(含注释、console)生成哈希,但上线用压缩版
- 构建流程里自动注入版本号、时间戳或 sourcemap 注释,导致哈希漂移
- CDN 开启了 Brotli/Gzip 压缩,但哈希是对原始未压缩文件算的(正确做法:对磁盘上最终上传的文件算哈希)
- 哈希格式必须是
sha256-...、sha384-...或sha512-...,且值为 Base64 编码(不是 hex)
多个 integrity 值按从左到右顺序匹配首个有效项
你可以提供多套哈希应对不同算法兼容性,比如同时支持 sha256 和 sha384:
立即学习“前端免费学习笔记(深入)”;
<script src="https://cdn.example.com/lib.js" integrity="sha256-abc... sha384-def..." crossorigin="anonymous"> </script>
浏览器会依次尝试每个哈希,一旦某个匹配就停止;但如果第一个格式错误(比如少写了 sha256- 前缀),整个属性会被当作无效而跳过校验。
真正容易被忽略的是:哈希失效时,脚本静默失败——页面既不报错也不执行,控制台只有一条类似 Failed to find a valid digest in the 'integrity' attribute 的 warning,很容易被淹没在其他日志里。上线前务必手动删掉哈希测试是否真能拦截篡改。



















