sri校验不生效的首要原因是未配置crossorigin属性,必须同时设置integrity和crossorigin(anonymous或use-credentials),否则浏览器静默跳过校验;哈希须基于目标url实际响应体计算,仅script和link[rel=stylesheet]支持。

加了 integrity 却没校验?八成是漏了 crossorigin,或者哈希根本不是从线上真实响应体算出来的。
为什么写了 integrity 但浏览器完全不校验
浏览器只在满足两个硬性条件时才启动 SRI 校验:标签必须是 <script></script> 或 <link rel="stylesheet">,且同时存在 integrity 和合法的 crossorigin 属性。缺一不可。
-
crossorigin值只能是"anonymous"或"use-credentials";写成空字符串crossorigin=""在 Chrome 中可工作,但在 Firefox 中可能被忽略,建议统一用crossorigin="anonymous" - 如果服务端返回的响应头不含
Access-Control-Allow-Origin(值不能是*,必须是具体域名),资源会加载失败,连校验机会都没有 - 控制台不会报“integrity missing crossorigin”,只会静默跳过——你看到样式失效、
jQuery is not defined,就该先查这个
怎么生成真正有效的 integrity 值
哈希必须基于浏览器最终请求到的字节流计算,不是本地文件、不是压缩前版本、不是带 BOM 的副本。
- 用
curl -sL https://cdn.example.com/lib.js | openssl dgst -sha384 -binary | openssl base64 -A——-sL确保跟随重定向并静默,-binary和-A保证输出与浏览器解压后比对逻辑一致 - 别用
cat file.js | openssl...:本地文件可能有换行符差异、BOM、未 gzip、或未经过 CDN 的 minify 流程 - 算法优先选
sha384:比sha256抗碰撞更强,主流 CDN(jsDelivr、unpkg)默认支持,且浏览器兼容无压力 - 在线生成器(如 srihash.org)能用,但一旦出问题,你无法控制重定向、编码、压缩等中间环节,排查成本陡增
哪些地方写了 integrity 也白写
浏览器只认特定上下文,其他全是无效装饰。
-
<img src="..." integrity="...">:不支持,忽略 -
<link rel="icon" href="..." integrity="...">:不支持,忽略 -
<iframe src="..." integrity="..."></iframe>:不支持,忽略 - 内联脚本(
<script>console.log(1)</script>):不支持,SRI 只校验外部资源 - 动态 import:
import('./chunk.js')加了integrity属性也没用,浏览器不解析该语句中的 integrity
fetch() 里用 integrity 为什么没反应
fetch() 的 integrity 选项不是“全局开关”,它只在校验链完整时才触发。
- 必须显式设置
mode: "cors";设成"no-cors"时,浏览器直接静默忽略integrity - 响应 MIME 类型必须是可信类型,比如
text/javascript、application/javascript、text/css;返回application/json就不校验 - 它只校验当前 fetch 的响应体,不递归检查该 JS 里
import的其他模块,也不管后续fetch('/api')请求 - 即使校验失败,也不会抛异常,而是让
response.body变为空流——你需要手动检查response.ok和状态码
最常被忽略的一点:SRI 不防运行时篡改。它只确保文件加载那一刻没被中间人替换,一旦脚本执行,里面调用的 eval、innerHTML、或动态 document.write,全在它的保护范围之外。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











