子资源完整性 (SRI)
子资源完整性 (SRI) 是什么?
子资源完整性 (SRI)浏览器在执行第三方加载的脚本或样式表前,先校验其加密哈希值的机制,防止被篡改的文件被运行。
子资源完整性于 2016 年被确立为 W3C 推荐标准,它通过在 script 或 link 标签上设置 integrity 属性来配置,属性值包含预期文件的一个或多个 base64 编码的 SHA-256/384/512 摘要。浏览器会下载资源、重新计算摘要,若没有任何一个列出的哈希与之匹配,便拒绝执行或应用该资源;以空格分隔的多个哈希可让页面接受多个已知良好的版本。由于 SRI 需要事先知道确切的字节内容,因此它保护的是静态、锁定版本的资源,而非动态生成的资源。
SRI 是抵御 CDN 被攻陷及第三方脚本(如 Magecart 家族)被劫持的首要客户端防线。Polyfill.io 攻击说明了它为何重要:2024 年 2 月,cdn.polyfill.io 域名被新的所有者收购后,该 CDN 开始投递将移动端用户重定向到诈骗网站的载荷——Sansec 于 2024 年 6 月 25 日发现此事,受影响的网站超过 10 万个(记录为 CVE-2024-38526)。任何锁定了 integrity 哈希的页面都会直接拦截这个被篡改的文件,因为其摘要已不再匹配。
SRI 与 CSP 及 crossorigin 属性协同工作,并应结合版本锁定以及构建流水线中自动化的哈希重新生成,使代码与摘要始终保持一致,不致脱节。
flowchart TD
A["浏览器解析带有<br/>integrity 属性的标签"] --> B[从 CDN 获取资源]
B --> C[计算 SHA-256/384/512 摘要]
C --> D{摘要是否匹配<br/>某个列出的哈希?}
D -->|是| E[执行 / 应用资源]
D -->|否 — 被篡改或替换| F[拦截并抛出错误]● 示例
- 01
「<script src="https://cdn.example.com/lib.js" integrity="sha384-..." crossorigin="anonymous"></script>」。
- 02
在受支持环境中使用 CSP 指令「require-sri-for script style」,强制所有子资源使用 SRI。
● 常见问题
子资源完整性 (SRI) 是什么?
浏览器在执行第三方加载的脚本或样式表前,先校验其加密哈希值的机制,防止被篡改的文件被运行。 它属于网络安全的 应用安全 分类。
子资源完整性 (SRI) 是什么意思?
浏览器在执行第三方加载的脚本或样式表前,先校验其加密哈希值的机制,防止被篡改的文件被运行。
如何防御 子资源完整性 (SRI)?
针对 子资源完整性 (SRI) 的防御通常结合技术控制与运营实践,详见上方完整定义。
子资源完整性 (SRI) 还有哪些其他名称?
常见的别称包括: SRI。