下面是两个「银行登录页」,它们引用同一个第三方 CDN 脚本。
唯一区别:左边加了 SRI 保护,右边没加。
两边都是正常的,随便输入用户名和密码体验一下。这是 CDN 没有被攻击时的正常状态。
integrity="sha384-..."
无 integrity 属性
点击下面的按钮。两个页面会重新加载 — 但这次 CDN 上的 JS 文件已经被「替换」成恶意代码。
两个文件内容完全一样(同一个银行登录页、同一个被篡改的 CDN 脚本),唯一区别是那一行 integrity 属性。下载后用浏览器分别打开,对比效果。你也可以用 diff 工具查看它们的代码差异——只有一行不同。
带 integrity 属性 → 篡改脚本被浏览器拒绝
不带 integrity → 恶意代码正常执行
输入一个 CDN 上的 JS 或 CSS 文件地址,后端会抓取文件内容、计算 SHA-384 哈希,生成可直接复制使用的标签。
开发者在 script 标签的 integrity 属性中写入 JS 文件的 SHA-384 哈希值。
浏览器下载文件后计算实际哈希,与 integrity 对比。不匹配则拒绝执行。
加一个属性就完事。不影响性能、不影响缓存、全浏览器支持。
HTTP Archive 数据显示绝大多数网站的第三方脚本没有 SRI 保护,CDN 一旦被黑就全面沦陷。
<script
src="https://cdn.example.com/analytics.js"
integrity="sha384-oqVuAf..."
crossorigin="anonymous"
></script>
<script
src="https://cdn.example.com/analytics.js"
></script>