能,但仅当script标签跨域加载、integrity值基于cdn实际响应体计算、且显式设置crossorigin="anonymous"三者同时满足时才生效;缺一即静默失效。

integrity 属性真能防 CDN 劫持吗?
能,但只在三个条件同时满足时才生效:script 标签跨域加载、integrity 值基于该 CDN 实际返回的响应体计算、且显式写了 crossorigin="anonymous"。漏掉任意一条,浏览器就静默跳过校验——资源照常执行,你完全察觉不到。
为什么加了 integrity 却没拦住恶意脚本?
最常见原因是 crossorigin 缺失或写错。浏览器不会报错,也不会警告,它只是把 integrity 当成普通属性忽略。实际排查时要注意:
-
crossorigin="true"或crossorigin=""是无效值,必须是crossorigin="anonymous" - 即使脚本同源(比如你自己托管的 CDN),也必须显式声明
crossorigin="anonymous" -
type="module"脚本默认走 CORS,所以integrity会生效,但普通script必须手动加 - 用
curl -I https://cdn.example.com/lib.js检查响应头是否含access-control-allow-origin: *,不含就换 CDN 或加代理补头
怎么生成一个不翻车的 integrity 值?
别抄别人页面,别用本地文件,别信“一键生成”工具。唯一可靠方式是直取线上响应体:
- 用
curl -sL https://cdn.jsdelivr.net/npm/vue@3.4.21/dist/vue.global.js | openssl dgst -sha384 -binary | openssl base64 -A——-sL确保静默 + 跟重定向,openssl输出的是浏览器实际拿到的解压后字节 - 哈希前缀必须小写且带短横:
sha384-,不是SHA384:或sha384: - 输出必须是 base64 编码字符串,不能是 hex;末尾不能有多余换行或空格
- CDN 启用 Brotli/gzip 不影响,但若服务端未返回
Vary: Accept-Encoding,不同客户端可能拿到不同编码版本,导致哈希不一致
校验失败时浏览器到底怎么做?
不是报错后继续执行,而是彻底丢弃资源——连 onerror 都不会触发。你看到的现象通常是:
- 页面白屏或功能缺失,Network 面板里 JS 显示 200,但 Console 只有一条
Failed to find a valid digest in the 'integrity' attribute - 真正被劫持时,错误是
The resource <url> was blocked because integrity check failed</url>,这才是校验触发且不匹配的信号 - 本地用
file://打开 HTML 时,SRI 全部禁用,必须走http://localhost或 HTTPS 环境测试 - CSP 策略没放行 CDN 域名(如
script-src 'self'),浏览器连请求都不会发,integrity根本没机会运行
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











