Skip to content

Subresource Integrity

SRI 是什么

子资源完整性(Subresource Integrity,SRI)是允许浏览器检查其获得的资源(例如从 CDN 获得的)是否被篡改的一项安全特性。它通过验证获取文件的哈希值是否和你提供的哈希值一样来判断资源是否被篡改

SRI 解决了什么问题

  • 中间人攻击(MITM): SRI 可防止中间人通过篡改远程资源代码来注入恶意脚本。
  • 供应者安全性问题: 当网站依赖于第三方库或 CDN 提供的内容时,即使该第三方受到攻击或发生配置错误,SRI 也能保护用户不受恶意代码影响。

SRI 的功能和特点

  • 浏览器根据以下步骤处理 SRI:

当浏览器在 <script> 或者 <link> 标签中遇到 integrity 属性之后,会在执行脚本或者应用样式表之前对比所加载文件的哈希值和期望的哈希值。 对于从其他来源提供的资源的子资源完整性验证,浏览器还使用跨源资源共享(CORS)检查资源,以确保提供资源的来源允许它与请求来源共享。

如果脚本或样式表不符合其相关的 integrity 值,浏览器必须拒绝执行该脚本或拒绝应用该样式表,并且必须返回一个网络错误,表明该脚本或样式表的获取失败。

  • 使用特点:
  1. 哈希值校验:开发人员在引用外部资源时,在 HTML 标签中提供一个基于资源内容生成的加密散列值(通常采用 SHA-256, SHA-384 或 SHA-512 算法)。当浏览器下载资源后,会计算其实际内容的哈希值,并与引用中的预期哈希值进行比较,只有二者匹配才会执行或应用该资源。
html
<script
  src="https://example.com/example-framework.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
  crossorigin="anonymous"
></script>
  1. 跨域支持:通过 crossorigin 属性,SRI 还可以与 CORS 一起工作,以便从其他源正确加载并验证资源。

  2. 完整性保障:如果资源内容在服务器端被更改,浏览器检测到哈希值不匹配,则会拒绝加载资源,从而避免潜在的恶意行为对客户端产生危害。

参考文献

https://developer.mozilla.org/zh-CN/docs/Web/Security/Subresource_Integrity

Released under the MIT License.