加了integrity却没拦住被篡改的css,根本原因是未同时满足三个硬性条件:rel="stylesheet"、integrity属性、显式crossorigin(如anonymous);缺一即静默跳过校验,资源照常加载。

加了 integrity 却没拦住被篡改的 CSS,基本可以断定:不是哈希错了,就是 crossorigin 没配对,或者 CDN 根本没返回正确的 CORS 响应头。
为什么 link rel="stylesheet" 加了 integrity 还是加载成功?
浏览器只在满足全部三个硬性条件时才触发 SRI 校验:link 标签必须有 rel="stylesheet"、integrity 属性、且显式声明 crossorigin(值为 "anonymous" 或 "use-credentials")。漏掉任意一个,校验就静默跳过——资源照常加载,控制台连 warning 都没有。
-
crossorigin=""在 Chrome 中等价于anonymous,但 Firefox 解析更严格,建议统一写成crossorigin="anonymous" - 如果 CDN 返回的响应头里没有
Access-Control-Allow-Origin: *(公开 CDN)或明确域名(鉴权场景),浏览器拿不到完整响应体,SRI 根本无法启动 -
link rel="preload"、link rel="icon"、link as="style"等写法都不支持 SRI,写了integrity也白搭
怎么生成 link 标签用的正确 integrity 值?
哈希必须基于目标 URL 实际返回的字节流计算,不是你本地保存的 .css 文件,也不是构建产物目录里的那个。CDN 可能重定向、压缩、加 BOM、甚至按 UA 返回不同内容——这些都会让本地算的哈希失效。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 可靠命令:
curl -sL https://cdn.example.com/style.css | openssl dgst -sha384 -binary | openssl base64 -A(-sL确保跟随重定向并静默输出,-A防止 base64 换行) - 算法优先选
sha384:比sha256抗碰撞更强,主流 CDN 全支持;sha512浏览器不认,写了也无效 - 在线工具(如 srihash.org)方便,但无法控制重定向链、BOM、编码细节,出问题时难复现
link 的 SRI 失败后浏览器到底怎么做?
失败不是报错后继续执行,而是直接丢弃整个资源——连 CSS 解析都不做。结果就是样式完全不生效,页面可能白屏、布局错乱、字体回退,控制台只报一条冷冰冰的错误:
The resource https://cdn.example.com/style.css was blocked because integrity check failed
- 这个错误不会触发
onerror回调,也不会进入window.onerror,你没法靠 JS 捕获并 fallback - 如果多个
link都用了 SRI,其中一个失败,其余不受影响;但若它是关键基础样式(比如重置样式或主题色定义),后果可能很严重 - 注意:HTTP 协议下部分浏览器会直接忽略
integrity,强制走 HTTPS 才能确保校验生效
真正容易被忽略的是:SRI 只管这一条 link 下载下来的字节是否匹配,它不管这个 CSS 里 @import 的其他文件,也不管 JS 里动态插入的 style 标签。防线就卡在那一行 HTML 上,多写一个空格、少一个 crossorigin,整条链就断了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










