sri校验生效必须同时配置integrity和crossorigin="anonymous"属性,缺一则静默失效;哈希须基于线上真实响应体计算,仅script和link[rel=stylesheet]支持。

script标签的integrity属性本身不生效,必须搭配crossorigin="anonymous"才能启动SRI校验;哈希值必须从线上真实响应体计算,且仅<script>和<link rel="stylesheet">支持该机制。</script>
integrity和crossorigin必须同时出现
浏览器看到integrity属性后,会强制走CORS流程校验资源,但前提是显式声明crossorigin。只写integrity、漏写crossorigin、或写错值(如crossorigin="true"),校验都会静默跳过——页面照常加载,控制台不报错也不警告。
- 公开CDN(如cdn.jsdelivr.net、unpkg.com、code.jquery.com)统一用crossorigin="anonymous"
- 若资源需携带Cookie(极少数自有后端场景),才用crossorigin="use-credentials",且服务端必须返回Access-Control-Allow-Credentials: true和明确的Access-Control-Allow-Origin(不能是*)
- 写成crossorigin=""在Chrome中等价于anonymous,但Firefox解析更严格,建议始终明确写成crossorigin="anonymous"
哈希值必须来自线上实际响应体
本地下载的.js文件、构建产物、复制粘贴的他人哈希、甚至在线生成器算出的值,只要与浏览器最终请求到的字节流不一致,SRI就必然失败。CDN可能重定向、返回gzip/Brotli压缩内容、插入BOM、或按User-Agent返回不同版本。
- 可靠命令:curl -sL https://cdn.example.com/app.js | openssl dgst -sha384 -binary | openssl base64 -A
- -sL确保静默并跟随重定向,openssl默认对解压后的明文哈希,与浏览器行为完全一致
- 避免用在线工具(如srihash.org)替代该命令——它无法控制重定向链、编码细节或BOM,出问题难复现
只对特定标签生效,其他写法全部无效
SRI是W3C规范限定的机制,仅作用于HTML解析阶段的静态标签,且只覆盖两类:
- <script src="..." integrity="..." crossorigin="anonymous"></script>
- 内联脚本(<script>console.log()</script>)、
、
校验失败时的行为和排查要点
SRI失败不会触发onerror事件,脚本或样式表被直接丢弃,不解析也不执行。控制台仅提示一句模糊错误:Failed to find a valid digest in the 'integrity' attribute,不指明具体是哪个URL或标签。
- 页面白屏或功能异常时,优先检查所有含integrity的<script>和<link rel="stylesheet">标签</script>
- CSP策略必须放行CDN域名:script-src 'self' https://cdn.jsdelivr.net;否则连请求都发不出,SRI根本没机会工作
- 算法推荐sha384:比sha256抗碰撞更强,主流浏览器全支持;sha512不被识别,写了也静默失效











