sri校验失效的主因是未配crossorigin属性或哈希非源自线上实际响应体;必须同时设置integrity和crossorigin="anonymous"(公开cdn)或"use-credentials"(鉴权场景),且仅script和link[rel="stylesheet"]支持。

加了 integrity 却没拦住被篡改的脚本?大概率是 crossorigin 没配,或者哈希算错了——SRI 不会报错,只会静默失效。
为什么只写 integrity 根本不校验
浏览器只在 CORS 请求流程中读取 integrity 值。没写 crossorigin,或写成 crossorigin=""、crossorigin="true" 这类非法值,校验就完全跳过,资源照常加载。
-
crossorigin="anonymous"是公开 CDN(如 jsDelivr、unpkg)的唯一正确写法 -
crossorigin="use-credentials"极少用,需服务端同时返回Access-Control-Allow-Credentials: true和明确的Access-Control-Allow-Origin(不能是*) - 即使资源同源(比如自己托管的 CDN),也必须显式写
crossorigin="anonymous"
哈希值必须从真实 URL 的响应体计算
本地文件、网页里抄的、在线生成器随便输个 URL 算出来的哈希,99% 无效。CDN 可能压缩、重定向、加 BOM,甚至按 UA 返回不同内容。
- 可靠命令:
curl -sL https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js | openssl dgst -sha384 -binary | openssl base64 -A -
-sL必须:静默 + 跟随重定向,否则哈希的是 302 响应体 - 别手动解压或加
--compressed:curl默认已处理 gzip/Brotli,返回的就是浏览器实际收到的字节 - 算法只用
sha384:比sha256抗碰撞更强,Chrome/Firefox/Edge 全支持;sha512浏览器直接忽略
CSP 必须放行 CDN 域名,否则 SRI 根本没机会运行
SRI 只负责校验,CSP 才决定“能不能发请求”。如果 CSP 策略没列 CDN 域名,浏览器连请求都不会发。
- 错误写法:
script-src 'self'→ 即使写了integrity,也会报Refused to load script from 'https://cdn.example.com' - 正确写法:
script-src 'self' https://cdn.jsdelivr.net https://unpkg.com - 可加
require-sri-for script style指令,强制所有外链脚本/样式必须带integrity,否则拒绝加载
样式表 SRI 失败时很难察觉
<link rel="stylesheet"> 的 SRI 校验失败不会阻塞页面渲染,也不会报红错,只会静默丢弃样式,并在 Console 里埋一条 Failed to find a valid digest in the 'integrity' attribute 的 warning(默认可能被过滤掉)。
- 检查 Network 面板里该 CSS 请求的响应头是否有
Content-Encoding: gzip或br:哈希必须基于解压后的原始字节 - Firefox 对
crossorigin=""解析更严格,统一写成crossorigin="anonymous"更稳妥 - 构建时用
webpack-subresource-integrity插件自动注入,避免手抖漏写或算错
最常被忽略的一点:SRI 生效的前提是 CDN 返回了 Access-Control-Allow-Origin: *(或具体域名)。如果这个响应头缺失,即使 integrity 和 crossorigin 都对,浏览器也会因 CORS 失败而终止请求——这时你看到的是跨域错误,不是哈希不匹配。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











