跳到正文

SRI 完整性哈希生成

Subresource Integrity Hash

为你粘贴或拖进来的脚本、样式表算出 Subresource Integrity 属性(sha256/384/512)。

一个指向 CDN 的 `<script src>`,等于长期授权那个 CDN 在你用户的浏览器里运行它想运行的任何代码。子资源完整性属性收回这份授权:哈希和你钉住的那个不一致的文件,浏览器拒绝执行。

⚡ 本地运行,必要时由服务器搭把手sriintegritywebhash

把要发布的那个文件原样拖进来

就是你真正要提供的脚本或样式表。原样计算哈希。

用浏览器里的 WebCrypto 计算,得到的正是浏览器之后要比对的那个摘要。这里故意没有网址输入框:从本页去抓一个远程文件来算哈希,要么被 CORS 拦下,要么成了 SSRF 的入口,而且浏览器没法像服务器那样先解析再钉住一个主机。请放进你真正要发布的那个文件。

怎么用

  1. 给它文件或 URL

    拖入你将要上线的那个文件,或者抓取一个 URL。哈希是对字节算的,所以一个文件和一个只差一个换行符的 URL 会给出不同的属性。

  2. 复制整个属性

    输出是 `integrity="sha384-…"`。把它连同 `crossorigin="anonymous"` 一起粘到标签上——没有后者,跨域资源是不透明的,完整性无法校验。

  3. 钉住版本,不要钉一个会动的标签

    对着 `@latest` URL 写的 integrity 属性,会在 CDN 发布新版的那天把站点弄坏。指向一个确切的版本,两者一起更新。

常见问题

该用哪种算法?

sha384 是通常的选择,也是大多数 CDN 公布的。sha256 也被接受,sha512 更强,但这个差别不是这套设计的弱点——钉错版本才是。

加上之后脚本就不加载了。

几乎总是三件事之一:CDN 上的文件变了、缺了 `crossorigin="anonymous"`、或者哈希取自和实际提供的不同的构建(比如压缩版对非压缩版)。

SRI 能防住一个从一开始就是恶意的、被篡改的脚本吗?

不能。它保证的是你拿到的是你钉住的那些字节,仅此而已。如果你钉住的版本本身已经带了后门,SRI 每一次都会忠实地把后门送到。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。