使用子资源完整性 (SRI) 和 SRI 哈希计算器保障 Web 应用安全
在现代 Web 开发中,我们很少从零开始构建一切。我们依赖内容分发网络 (CDN) 来托管我们喜欢的库,如 React、Vue 或 Bootstrap。然而,这种依赖引入了一个风险:如果 CDN 被攻破,并且你加载的脚本被替换为恶意代码怎么办?
这就是子资源完整性 (SRI) 发挥作用的地方。本指南将解释 SRI 的工作原理,以及如何使用 SRI 哈希计算器来确保用户的安全。
1. 什么是子资源完整性 (SRI)?
子资源完整性 (SRI) 是一种安全功能,它允许浏览器验证其获取的资源(例如,从 CDN 获取的资源)在交付过程中没有经过意外的篡改。
工作原理
当你在 HTML 中包含资源时,你需要在 integrity 属性中提供该资源的加密哈希。然后浏览器会:
- 获取资源。
- 计算所获取资源的哈希值。
- 将其与你提供的哈希值进行比较。
- 如果匹配,则执行资源。如果不匹配,浏览器将阻止该资源。
HTML 语法
<script src="https://example.com/example-framework.js"
integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcOtpguf4Dez6GdrJCT9Wo+SWax9fEE99l"
crossorigin="anonymous"></script>
2. 使用 SRI 哈希计算器
要实施 SRI,你需要所加载文件的正确加密哈希。SRI 哈希计算器可以自动完成此过程。
SRI 常用的哈希算法
- SHA-256:安全但哈希值略短。
- SHA-384:SRI 最常用的推荐算法(兼顾安全性和长度)。
- SHA-512:最安全,生成的哈希值较长。
生成 SRI 哈希的步骤
- 提供文件:上传脚本的本地版本或提供 CDN 资源的 URL。
- 选择算法:在 SHA-256、SHA-384 或 SHA-512 之间进行选择。
- 生成:该工具将生成一个以算法名称开头的字符串(例如,
sha384-...)。 - 复制并粘贴:将生成的字符串插入脚本或链接标签的
integrity属性中。
3. 为什么 SRI 对现代 Web 安全至关重要
防御 CDN 被攻破
即使大型 CDN 被黑,SRI 也能确保你的网站保持安全。恶意代码将无法匹配你的哈希,浏览器将直接拒绝运行它。
合规性与信任
使用 SRI 是 OWASP 等安全组织推荐的最佳实践。它向你的用户和客户证明你非常重视他们的数据安全。
防止“中间人”攻击 (MITM)
SRI 保护受损网络(如公共 Wi-Fi)上的用户免受可能尝试在流量中注入恶意代码的攻击者的侵害。
4. 排查 SRI 故障
如果你的资源无法加载,你可能会在控制台中看到如下错误消息:
None of the "integrity" hashes in the "integrity" attribute match the content of the subresource.(“integrity”属性中的任何“integrity”哈希都不匹配子资源的内容。)
常见原因:
- 哈希不正确:生成哈希时使用了错误版本的文件。
- 缺少
crossorigin属性:为了让 SRI 在跨域请求上工作,crossorigin="anonymous"属性是必不可少的。 - CDN 压缩:一些 CDN 可能会动态修改文件内容(如即时混淆或压缩),这会改变哈希值。请确保你哈希的对象与浏览器接收到的完全一致。
SRI 最佳实践摘要
| 行动 | 原因 |
|---|---|
| 使用 SHA-384 | 行业标准的性能与安全性平衡。 |
务必添加 crossorigin |
跨站 SRI 验证所必需。 |
| 审计第三方脚本 | 仅对来自信誉良好来源且你信任的脚本使用 SRI。 |
| 自动生成哈希 | 使用 SRI 计算器以防止手动输入错误。 |
结论
子资源完整性是一种强大且低开销的方式,可以显著提高 Web 应用的安全性。通过将 SRI 哈希计算器作为部署过程的一部分,你可以保护你的网站和用户免受现代 Web 中最常见的攻击向量之一的侵害。
常见问题解答 (FAQ)
问:我可以对我自己的内部脚本使用 SRI 吗?
答: 可以,尽管这不如对第三方脚本那样关键。它仍可以作为构建过程中有用的完整性检查。
问:如果 CDN 更新了脚本版本会怎样?
答: 如果文件的内容发生了变化(哪怕只有一个字符),哈希值也会改变。每当你更新脚本版本时,都必须更新 integrity 属性。
问:SRI 会减慢页面加载速度吗?
答: 性能影响微乎其微。现代浏览器在处理脚本时会非常快速地计算哈希。