子资源完整性真的有效吗?

Posted

技术标签:

【中文标题】子资源完整性真的有效吗?【英文标题】:Is Subresource Integrity actually working? 【发布时间】:2018-07-23 17:43:30 【问题描述】:

我决定将 SRI 添加到我们的 CDN 脚本中,但我想测试它是否有效。如果我手动更改哈希脚本仍然加载。我期待控制台中出现某种错误代码或其他内容。

例如,这是正确的哈希:

<script crossorigin="anonymous" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ= sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ sha512-jGsMH83oKe9asCpkOVkBnUrDDTp8wl+adkB2D+//JtlxO4SrLoJdhbOysIFQJloQFD+C4Fl1rMsQZF76JjV0eQ=="
src="https://code.jquery.com/jquery-1.12.4.min.js"></script>

如果我将每个 sha 哈希中的第一个字符更改为:

<script crossorigin="anonymous" integrity="sha256-YosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ= sha384-mvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ sha512-iGsMH83oKe9asCpkOVkBnUrDDTp8wl+adkB2D+//JtlxO4SrLoJdhbOysIFQJloQFD+C4Fl1rMsQZF76JjV0eQ=="
src="https://code.jquery.com/jquery-1.12.4.min.js"></script>

我预计它会失败。但事实并非如此。在 Firefox 58.0.2 和 Chrome 64.0.3282.140 中测试,两者都支持 SRI。缓存已关闭,我可以在开发人员工具中看到每次都重新获取脚本。

我还能做些什么来验证是否使用了 SRI?我是不是从根本上误解了什么……?

【问题讨论】:

【参考方案1】:

我已经用一些样式表对其进行了测试,它似乎在那里工作,包括 Firefox 报告中的控制台:

完整性属性中没有一个“sha384”哈希与子资源的内容匹配。

样式表没有加载也很明显。我认为脚本一定存在缓存问题。

【讨论】:

顺便说一句,我根本无法让 Google 的字体 API 使用它。我得到一个哈希,但他们总是失败。我怀疑嵌入了跟踪,这意味着每个请求的有效负载都会发生变化,从而破坏了哈希。

以上是关于子资源完整性真的有效吗?的主要内容,如果未能解决你的问题,请参考以下文章

子资源完整性对内联 JavaScript 有用吗?

子资源完整性:如何仅显示警告而不显示阻止资源?

检查请求是不是是 Chrome 扩展程序中的子资源完整性

一学就会的Vue slot插槽,真的不看看吗?(使用脚手架)

Firebase 上的子资源完整性安全标头

animate.css 的子资源完整性?