SRI仅对<script>和<link rel="stylesheet">生效,且必须与crossorigin成对使用;若缺失或配置错误(如CDN未返回正确CORS头),浏览器将跳过校验,integrity形同虚设。

加了 integrity 属性,不代表资源就真被校验了——它只在 <script> 和 <link rel="stylesheet"> 上生效,且必须和 crossorigin 成对出现,否则浏览器直接跳过校验,连错误都不报。
为什么加了 integrity 却没拦截篡改的 JS?
最常见原因是漏写或写错 crossorigin。浏览器看到 integrity 后会强制走 CORS 请求流程,但若没声明 crossorigin,或 CDN 响应头缺失 Access-Control-Allow-Origin,浏览器拿不到完整响应体,哈希比对根本不会触发。
-
crossorigin="anonymous"是绝大多数公开 CDN(如 jsDelivr、cdn.jsdelivr.net)的正确取值 -
crossorigin="use-credentials"仅当你自己的后端要求带 Cookie 访问静态资源时才用,且后端必须返回Access-Control-Allow-Credentials: true和明确的Access-Control-Allow-Origin(不能是*) - 控制台不会提示“
crossorigin缺失”,只会安静地加载资源,integrity形同虚设
integrity 值怎么生成才不翻车?
哈希必须基于目标 URL 实际返回的响应体计算,不是你本地保存的文件,也不是 HTML 里写的路径内容。CDN 可能重定向、压缩、加 BOM、甚至返回不同编码的 UTF-8 —— 这些都会让本地算的哈希失效。
- 推荐命令:
curl -sL https://cdn.example.com/lib.js | openssl dgst -sha384 -binary | openssl base64 -A(-sL确保跟随重定向并静默输出) - 算法优先选
sha384:比sha256抗碰撞更强,主流 CDN 默认支持 - 哈希值必须是 base64 编码后的字符串,不能是 hex 原始串(比如不能写
sha256-abc123,得是sha256-AbCdEf...) - 在线工具(如 srihash.org)方便,但出问题时难排查细节(比如是否处理了重定向、BOM)
哪些标签支持 SRI?哪些写了也白写?
SRI 是 W3C 明确定义的机制,只作用于两类标签:<script> 和 <link rel="stylesheet">。其他所有加载方式都不受保护,写了 integrity 也没任何效果。
立即学习“前端免费学习笔记(深入)”;
-
<img src="..." integrity="...">:浏览器完全忽略,不校验也不报错 -
<iframe src="...">或fetch()动态加载:SRI 规范未覆盖,无法启用 -
document.createElement('script')并手动设置src和integrity:浏览器不校验,只认 HTML 解析阶段的静态标签 - 内联脚本(
<script>console.log(...)</script>):不支持,integrity属性无效
校验失败时会发生什么?
浏览器发现哈希不匹配,会直接丢弃该资源,连解析都不做。JS 不执行,CSS 不应用,页面可能白屏或功能异常,但 onerror 事件不触发,控制台只报模糊错误:
Failed to find a valid digest in the 'integrity' attributeThe resource <url> was blocked because integrity check failed
这些错误不会告诉你具体是哪个标签出问题,需要你逐个检查含 integrity 的 <script> 和 <link> 标签。更麻烦的是:哈希值本身是构建产物的一部分,一旦资源更新而哈希没同步,问题就会在上线后才暴露——所以必须把哈希生成纳入 CI/CD 流程自动注入 HTML,不能靠人手复制粘贴。



















