请解释 Subresource Integrity (SRI) 的作用和用法。

推荐答案

Subresource Integrity (SRI) 是一种安全机制,用于确保浏览器加载的外部资源(如 CSS 和 JavaScript 文件)未被篡改。它通过验证资源的哈希值来实现,从而防止恶意代码注入或资源被替换。

SRI 的基本用法是,当你在 HTML 中引入一个外部资源时,除了指定 src 属性外,还会添加 integrity 属性,其值为资源哈希值。浏览器在加载资源后会计算其哈希值并与 integrity 属性的值进行比较。如果两者不匹配,浏览器会拒绝加载该资源。

例如:

integrity 属性值包含一个或多个哈希值,由哈希算法前缀 (例如 sha256-, sha384-, 或 sha512-) 和资源的 Base64 编码的哈希值组成。 crossorigin 属性通常与 SRI 一起使用,以避免 CORS 相关的问题。

本题详细解读

SRI 的核心原理

SRI 的核心思想是利用哈希算法的特性。哈希算法是一种单向函数,它接受任意长度的输入(即原始资源)并输出固定长度的摘要(即哈希值)。如果输入发生任何微小的改变,输出的哈希值也会发生巨大的变化。

SRI 机制中,资源的哈希值在发布时生成,并在 HTML 中被指定为 integrity 属性的值。当浏览器加载资源时,会重新计算资源的哈希值,并与 integrity 属性中提供的哈希值进行对比。如果哈希值匹配,则说明资源没有被篡改;如果不匹配,则浏览器会拒绝加载该资源,防止恶意代码的执行。

SRI 的优势

  • 安全性增强: 防止 CDN 或其他外部资源提供商的服务器被攻击后,向你的网站注入恶意代码。
  • 数据完整性: 确保用户接收到的资源是原始、未经修改的。
  • 减少风险: 降低供应链攻击风险,即攻击者通过修改第三方资源来攻击你的网站。

如何生成哈希值

可以使用各种工具来生成文件的哈希值,例如:

  • openssl 命令行工具: 在 Linux 或 macOS 系统中,可以使用 openssl 命令来生成哈希值。例如,使用 SHA-384 算法:

  • 在线哈希生成器: 有许多在线工具可以生成文件的哈希值,方便快捷。

  • Webpack 和其他构建工具: 许多构建工具和打包工具(例如 webpack)提供插件,可以在构建过程中自动生成 SRI 哈希值,方便使用。

crossorigin 属性的重要性

由于 CORS(跨域资源共享)策略,当使用 SRI 时,通常需要设置 crossorigin 属性。对于跨域加载的资源,浏览器需要知道如何处理资源。当 crossorigin 设置为 anonymous 时,浏览器会发起不带凭据的请求;设置为 use-credentials 时,会包含凭据。由于涉及到跨域问题,需要根据实际情况来选择。如果资源和网页来自同一域,可以不使用crossorigin

SRI 的局限性

  • 哈希值管理: 当资源更新时,必须重新生成新的哈希值并更新 HTML 中的 integrity 属性。
  • 初始设置成本: 为每个外部资源设置 SRI 需要一定的工作量,尤其是在项目初期。
  • 不兼容性: 早期浏览器版本可能不支持 SRI,但目前大多数主流浏览器都支持。

最佳实践

  • 优先使用 CDN: 使用知名的 CDN 可以提高资源加载速度,并降低服务器的负载。
  • 为所有外部资源启用 SRI: 为所有外部资源(包括 CSS 和 JavaScript 文件)都启用 SRI 以获得最大程度的保护。
  • 选择可靠的哈希算法: 选择安全的哈希算法,例如 SHA-384 或 SHA-512。
  • 自动化哈希生成: 使用构建工具或脚本自动化 SRI 哈希值的生成和管理。
  • 定期检查: 定期检查引用的外部资源,确保它们仍然有效并且没有被篡改。
纠错
反馈