SRI校验必须同时配置integrity和crossorigin属性才生效,缺一则静默跳过;哈希须基于真实CDN响应体计算,仅script和link[rel=stylesheet]支持,且CDN需返回Access-Control-Allow-Origin响应头。

只写 integrity 属性,SRI 根本不生效
浏览器看到 integrity 就会强制走 CORS 流程,但若没配 crossorigin,就拿不到响应体,哈希比对直接跳过——控制台不会报错,资源照常加载,你等于白加。
必须同时写:
-
integrity="sha384-..."(算法+Base64编码哈希) -
crossorigin="anonymous"(公开 CDN 的标准写法,crossorigin=""在 Firefox 中可能被忽略)
写成 crossorigin="use-credentials" 仅当你自己的后端要求带 Cookie 访问资源时才用,且后端必须返回 Access-Control-Allow-Credentials: true 和明确的 Access-Control-Allow-Origin(不能是 *)。
哈希值必须从真实 URL 响应体生成,不是本地文件
CDN 返回的内容可能被 gzip/Brotli 压缩、重定向、带 BOM、甚至因 UA 或缓存策略返回不同版本。你本地保存的 jquery.min.js 和浏览器实际拿到的字节流大概率不一致。
立即学习“前端免费学习笔记(深入)”;
正确做法是模拟浏览器行为,用这条命令:
curl -sL https://cdn.jsdelivr.net/npm/react@18.2.0/umd/react.production.min.js | openssl dgst -sha384 -binary | openssl base64 -A
关键点:
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
-
-sL:静默 + 跟随重定向,确保拿到最终响应 -
-binary和-A:输出无换行的 Base64 字符串,和浏览器校验逻辑一致 - 别用
cat file.js | openssl——本地文件可能含 BOM、换行符差异、未压缩
<script></script> 和 <link rel="stylesheet"> 是唯二支持 SRI 的标签
其他所有写法,浏览器完全忽略 integrity,不校验也不报错:
-
<img src="" integrity="" alt="HTML中使用SRI哈希指纹验证外部脚本和样式表完整性的方法" >:无效 -
<link rel="icon">或<link rel="preload">:不支持 -
document.createElement('script')后手动设src和integrity:不触发校验 -
fetch()、import()、<iframe></iframe>:SRI 规范未覆盖
内联脚本(<script>...</script>)也不支持 integrity 属性。
SRI 失败时没有 onerror,排查靠控制台警告和网络响应
校验失败时,脚本或样式表被静默丢弃,只在 Console 输出一句:
Failed to find a valid digest in the 'integrity' attribute
这个提示不指明是哪个 URL、哪条标签出问题,且默认是 warning 级别,容易被过滤掉。排查时要:
- 打开 Network 面板,逐个检查含
integrity的<script></script>和<link>请求,看响应状态码和响应头 - 确认响应头是否含
Content-Encoding: gzip或br——SRI 校验的是解压后明文,哈希必须基于解压结果算 - 检查响应体是否有 BOM、末尾空格、换行符等肉眼难辨的差异
最容易被忽略的是:你以为哈希是对的,其实 CDN 已悄悄更新了资源但没改 URL,或者你用了带 query 参数的构建产物 URL(如 ?v=123),而 CDN 缓存了不同版本。


















