网易首页 > 网易号 > 正文 申请入驻

理解 Subresource Integrity

0
分享至

如果你曾经使用过 CDN 托管的 JavaScript 库,你可能会注意到 script 标签上有一个奇怪的 integrity 属性。这个属性包含了看似冗长的毫无意义的字符,你可能会在清理冗余代码时想把它们去掉。

这些冗长的字符实际上是一个非常有用的安全特性,称为 Subresource Integrity(中文翻译为子资源完整性,简写为SRI),它可以帮助保护你的网站免受某些类型的黑客攻击和破坏。在本文中,我们将了解什么是SRI,它是如何帮助保护你的,以及你如何在自己的项目中使用它。

由来

回想以前,JavaScript 是和 HTML 及CSS 混杂在一起的,我们无需过多考虑网站中的脚本会被用做攻击的工具。大多数网站都托管在自己的一台物理服务器上,当谈到安全最佳实践时,我们考虑的是保护该服务器。

随着浏览器变得更加强大,网速更快,我们开始使用越来越多的JavaScript,最终可重用的JavaScript 库开始涌现。在早期,像 script.aculo.us、Prototype 和 jQuery 这样的库开始被普遍采用以增强网页的交互性。

随着这些库和插件的增加,页面体积也越来越大,然后我们开始认真考虑优化前端性能。像 CDN 这样的资源,以前是大公司的储备,现在对于从事 Web 开发的人来说已经司空见惯。

在这个过程中,有些聪明的开发者注意到了许多网站都在使用自己的公共库文件,例如最新的 jQuery,如果在一个公共 CDN 上托管这个文件可供每个网站使用,那样用户就不必每次都下载相同的文件了。他们在首次使用此文件时下载,然后会保存在浏览器缓存里,访问其他网站时如果再用到此文件时直接从浏览器缓存中读取即可!

这就是为什么像 jsdelivr 这类 CDN 非常受欢迎的原因,它们托管了许多流行的类库可供所有网站使用。

遇到了什么问题?

使用 CDN 仍然是一种有效提升前端性能的方式,不过也带了潜在的安全问题。让我们假设现在是2012年,每个人都在使用新出的 jQuery 1.8。回到传统的做事方式,每个网站都有自己的 jQuery 1.8文件,寄放在自己的服务器上以供自己的网站使用。

如果你是攻击者,并且想出了一个偷偷摸摸的方法来黑掉这个类库以获取非法所得,你必须单独针对每个网站,单独攻击每个网站的服务器。那样需要耗费巨大的精力。

但现在情况并非如此,因为每个网站都在使用从公共 CDN 加载的 jQuery。而我说的每个网站,并不是指几百个网页。我指的是数百万个网页。突然那个文件成了黑客非常有吸引力的目标。如果他们可以黑掉这一个文件,他们可以非常迅速地在全球数百万个网页上运行代码。

恶意代码是什么并不重要。可以是破坏页面的恶作剧代码,可能是窃取密码的代码,可能是挖掘加密货币的代码,也可能是悄悄记录用户行为用于精准市场营销的追踪代码。重要的是,开发人员添加到页面中的文件已经被更改,现在你的网站中有一些恶意的 JavaScript 代码在运行。这是个大问题。

引入 Subresource Integrity

我们不会因噎废食就放弃使用 CDN,SRI 提供了一种简单的提升安全的方案。SRI 和 integrity 属性的作用是确保你链接到网页的文件永远不会改变。如果它真的改变了,浏览器就会拒绝执行这个文件。

检查代码是否更改是计算机科学中一个非常老的问题,有一些非常好的解决方案。SRI 采用了最简单的方法——文件散列法(file hashing)。

文件散列是接收文件并通过算法运行文件内容生成一个短字符串的过程,这个生成的字符串称之为哈希值(hash)。这个过程是可重复的,如果你给别人一个文件和它对应的哈希值,他们就可以运行相同的算法来检查两者是否匹配。如果文件改变了或者哈希值改变了,那么就不再匹配了,你知道有问题,应该不信任这个文件。

使用 SRI 时,你的网页保存哈希值,服务器(CDN或其他地方)托管文件。浏览器下载文件,然后快速计算以确保它与 integrity 属性中的哈希值匹配。如果匹配,则使用该文件,如果不匹配,则被阻止。

使用 SRI

现在使用 BootstrapCDN 引入文件,官方会提供如下的引入代码:

可以看到 src 属性值指向了 CDN 上的文件,integrity 属性值就是对应的哈希值。

哈希值实际上分为两部分。第一部分是个前缀,它声明了所使用的是哪种哈希算法,上面的例子中采用的是 sha384。后面是一个横线以及使用了 base64 编码后的哈希值。

在浏览器中执行时,它会首先下载文件。在执行文件之前先 base64 解码哈希值,然后使用 sha384 哈希算法确保哈希值和刚下载的文件是匹配的。如果匹配,就会执行文件。

在浏览器中执行上述代码,可以看到 CSS 和 JS 文件都正确加载并执行了。在浏览器的开发者工具 Network 面板可以看到网络请求情况:

让我们看一下如果修改了 bootstrap.min.js 的哈希值会怎么样:

如上所见,文件被加载了,但是哈希值不再匹配,所以浏览器拒绝执行该文件。

在你的项目中使用 SRI

CDN 为公共类库提供的这个功能很棒,但是不止于此,你也可以在自己的网站使用 SRI。你可以为自己的文件生成哈希值,然后浏览器在执行前会执行校验,就像 CDN 提供的功能那样。

有一些工具可以生成 SRI 哈希值。你可以在命令行使用 openssl :

或者在命令使用 shasum :

此外,有些网站如 https://www.srihash.org/ 可以在线生成 SRI 哈希值。

如果你的资源文件和引入的网页位于不同的域名下,浏览器还会额外使用 CORS 检查资源文件,以确保允许来自其他域名的引用。因此,在托管资源文件的服务器上必须设置 Access-Control-Allow-Origin 响应头,以允许来自其他域名的请求。例如:

最后要说的是浏览器兼容性。目前 SRI 已经在主流浏览器上得到了支持,除了 IE。你可以放心使用这个特性,由于它是向后兼容的,在不支持 SRI 的浏览器上也不会引起问题,只不过失去了额外的保护。

结语

我们不仅了解了 integrity 属性中那些奇怪的散列值的作用,还学习了如何使用它们来防御对于网站的攻击。当然了,没有一劳永逸的方式可以保护我们的网站免受各种类型的攻击,但是子资源完整性是一个非常有用的工具。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
梅西伤情官宣:左腿腘绳肌负荷劳损+肌肉疲劳 不会缺席世界杯首战

梅西伤情官宣:左腿腘绳肌负荷劳损+肌肉疲劳 不会缺席世界杯首战

念洲
2026-05-26 06:56:32
健身房“性丑闻”全复盘:人一旦丢掉底线,到底能有多恐怖?

健身房“性丑闻”全复盘:人一旦丢掉底线,到底能有多恐怖?

聪明小石头
2026-02-10 15:19:46
胡锡进:华为会被历史至少记住1000年,嘲讽的人让我无法理解

胡锡进:华为会被历史至少记住1000年,嘲讽的人让我无法理解

映射生活的身影
2026-05-26 02:07:09
CBA总决赛迎来一大利好!篮协终于出手了:G1战直接取消中国裁判

CBA总决赛迎来一大利好!篮协终于出手了:G1战直接取消中国裁判

篮球快餐车
2026-05-26 05:34:55
1958年蒋介石最后一次见张学良,说道:西安的事对国家损失太大了

1958年蒋介石最后一次见张学良,说道:西安的事对国家损失太大了

别人都叫我阿腈
2026-05-26 02:18:43
交完6000万赎金,香港富豪被扔进公海喂鱼!幕后黑手竟是退休警长

交完6000万赎金,香港富豪被扔进公海喂鱼!幕后黑手竟是退休警长

娱乐洞察点点
2026-05-25 16:03:34
因店员漏放两根吸管,女子折返奶茶店辱骂大闹,门店:该顾客已去派出所;茉莉奶白客服:已反馈相关部门

因店员漏放两根吸管,女子折返奶茶店辱骂大闹,门店:该顾客已去派出所;茉莉奶白客服:已反馈相关部门

界面新闻
2026-05-25 16:57:02
“男性相亲避雷表”横空出世!网友:百发百中,基本没有猜错的

“男性相亲避雷表”横空出世!网友:百发百中,基本没有猜错的

火山詩话
2026-05-25 06:33:21
野史也不敢这么野啊!

野史也不敢这么野啊!

我是历史其实挺有趣
2026-05-26 09:41:15
尼克斯为了总决赛等待27年 总裁罗斯的“拼凑”成功了

尼克斯为了总决赛等待27年 总裁罗斯的“拼凑”成功了

仰卧撑FTUer
2026-05-26 11:52:51
生是我家人,死是我家鬼:姐姐劝弟弟打断妻子腿,弟弟直接打死了

生是我家人,死是我家鬼:姐姐劝弟弟打断妻子腿,弟弟直接打死了

江山挥笔
2026-05-26 10:39:53
隐瞒了40年!抗美援朝时苏联派7万大军参战,全世界被骗了半世纪

隐瞒了40年!抗美援朝时苏联派7万大军参战,全世界被骗了半世纪

浪子说
2026-05-26 00:40:03
一场音乐节封神三观!周深超高情商回应,胜过家长百句说教

一场音乐节封神三观!周深超高情商回应,胜过家长百句说教

草莓解说体育
2026-05-26 09:37:46
最美的战袍最差的战绩,央视解说喊话别再迷恋“高端局”

最美的战袍最差的战绩,央视解说喊话别再迷恋“高端局”

网球之家
2026-05-25 22:52:10
甜馨现身小酒窝生日会,小酒窝星味好浓,李小璐、杜华、甘薇都在

甜馨现身小酒窝生日会,小酒窝星味好浓,李小璐、杜华、甘薇都在

素素娱乐
2026-05-26 09:05:35
悲催!35岁一级建造师丈夫从月入35000失业半年,妻子就想离婚了

悲催!35岁一级建造师丈夫从月入35000失业半年,妻子就想离婚了

火山詩话
2026-05-26 05:58:57
洋葱立大功!医生发现:洋葱或对3种慢性病有好处!可以常吃

洋葱立大功!医生发现:洋葱或对3种慢性病有好处!可以常吃

芹姐说生活
2026-05-25 14:19:45
一夜暴雨,张艺谋取景地突遭浩劫!17人失联,竟还有游客滞留山上

一夜暴雨,张艺谋取景地突遭浩劫!17人失联,竟还有游客滞留山上

老五汽车世界
2026-05-26 00:24:53
王楚钦妈妈谈儿媳标准:不要豪门不要颜值,只要这三点!

王楚钦妈妈谈儿媳标准:不要豪门不要颜值,只要这三点!

酷侃体坛
2026-05-25 16:42:10
拒绝听命特朗普,美联储新主席宣誓,对华态度鲜明,中方再抛美债

拒绝听命特朗普,美联储新主席宣誓,对华态度鲜明,中方再抛美债

快乐彼岸
2026-05-26 11:17:41
2026-05-26 13:52:49
小象Web开发
小象Web开发
专注于web开发领域
25文章数 910关注度
往期回顾 全部

科技要闻

今年秋季,麒麟芯片将首次落地"逻辑折叠"

头条要闻

上海一小区车库土多得离谱 居民吐槽:不敢呼吸

头条要闻

上海一小区车库土多得离谱 居民吐槽:不敢呼吸

体育要闻

上赛季差点降入英甲,下赛季要踢英超了

娱乐要闻

景甜被曝停工失联 富商索要2亿和解费

财经要闻

中国铝行业爆单 下一个“煤炭”大周期?

汽车要闻

纯电续航310km 2026款海狮06DM-i上市售12.99万元起

态度原创

亲子
艺术
房产
家居
游戏

亲子要闻

什么牌奶粉好?恬 适 奶 粉 以多维配方助力宝宝舒适成长

艺术要闻

画美,文字也美 | 日本著名画家内田正泰

房产要闻

招商地产接盘碧桂园!海口这个烂尾豪宅,要彻底改命?

家居要闻

生与命相依 旧公寓改造

《Dota2》TI15直邀公布!Ame和fy再携手 征战上海

无障碍浏览 进入关怀版