Web 安全之 SRI(Subresource Integrity 子资源完整性)详解

什么是 SRI?

SRI,全称是 Subresource Integrity,即子资源完整性,是一种用于防范恶意攻击和提高网站安全性的策略,可以用来防止网站引用的资源(例如 JavaScript、CSS、图片等)被篡改。这个策略是通过在引用资源时提供一个对应的哈希值来实现的,浏览器在加载资源时会计算其哈希值,如果计算出的哈希值与对应的哈希值不相等,浏览器就不会加载这个资源。

举个简单的例子来说明一下,想象一下,你正在浏览一个网页,如果这个网页上有一张图片、一个 js 脚本文件或一个 css 样式被恶意篡改了,就可能会导致个人信息被窃取,账号被盗,或者会看到一些奇怪的东西。这时候,SRI 就可以担当起保护网站完整性的重要角色了。原理非常简单而且效果很好,就像给网站加载的资源打上了防伪标签一样。SRI 通过在引用外部资源(如js、css、图片等)的时候添加一个特殊的哈希值,来确保资源的完整性。

SRI 主要应用于 CDN(内容分发网络)环境,因为 CDN 的安全性不可控,一旦 CDN 出现安全问题,可能导致站点出现安全问题。因此,通过 SRI 可以有效防止用户加载被篡改过的资源。

使用方法

以引用 js 文件为例来说明如何使用 SRI,示例代码如下:

复制代码
<script src="https://xx.com/xxx.js" integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7"></script>

上面的代码中引用了一个 js 文件,并提供了 integrity 属性,integrity 属性值的第一部分是哈希算法(支持 SHA-384、SHA-256等),第二部分是对应的哈希值。浏览器加载这个 js 文件时,会计算其哈希值,如果和 integrity 中的哈希值不相等,则拒绝加载。

需要注意的是,使用 SRI 时一般还需要设置 crossorigin 属性,这是因为出于安全原因,浏览器默认不会计算跨域资源的哈希值,通过设置 crossorigin 属性,告诉浏览器计算这个资源的哈希值。例如:

复制代码
<script src="https://xx.com/xxx.js" integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7" crossorigin="anonymous"></script>

小结

SRI 是一种非常有用的安全策略,可以有效防止网站加载被篡改过的资源。但是也并不是能防止所有的攻击,例如,如果攻击者可以篡改网站的 HTML 代码,就可以修改或移除 integrity 属性。因此,SRI 应该作为多种防御策略的其中一种策略,与其他安全措施(例如HTTPS、Content Security Policy等)一起使用。

相关推荐
特立独行的猫A27 分钟前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
陈随易1 小时前
C++26 草案被否,二十八年来头一回
前端·后端·程序员
ZhengEnCi1 小时前
Agent 工具怎么折叠海量输出才「爽」:Trae、Claude Code 的渐进式披露设计原理
前端·agent
金銀銅鐵2 小时前
同一个 Hello World,Kotlin 和 Java 在字节码层面差在哪
jvm·后端·kotlin
IT_陈寒5 小时前
Redis内存暴涨,没想到是AOF重写捣的鬼
前端·人工智能·后端
ikoala5 小时前
让 Codex 自己查账:一个省 token 的小技巧
前端·后端·ai编程
ikoala5 小时前
AI 写页面像说明书,修 Bug 像贴膏药?把这两句话写进 AGENTS.md
前端·javascript·ai编程
武天旭5 小时前
AI安全--AI大模型的对抗样本攻击与防御解析
人工智能·深度学习·安全·机器学习
去伪存真7 小时前
AI Agent Harness 深度测评与技术选型实战
前端·agent
wo_jack8 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector