【发布时间】:2019-02-05 15:54:23
【问题描述】:
我最近发现了以下 nifty little site 用于为外部加载的资源生成子资源完整性 (SRI) 标签。例如输入最新的jQuery URL(https://code.jquery.com/jquery-3.3.1.min.js),得到如下<script>标签:
<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8= sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT sha512-+NqPlbbtM1QqiK8ZAo4Yrj2c4lNQoGv8P79DPtKzj++l5jnN39rHA/xsqn8zE9l0uSoxaCdrOgFs6yjyfbBxSg==" crossorigin="anonymous"></script>
我了解 SRI 哈希的用途,并且我知道它们可以使用不同的哈希大小(256 位、384 位或 512 位),但我以前从未见过像这样同时使用这三个哈希值。挖掘MDN docs,我发现
一个完整性值可能包含多个由空格分隔的哈希值。如果资源与其中一个哈希值匹配,则将加载该资源。
但是这种匹配究竟是如何进行的呢?是时候在一篇 SO 帖子中提出多个问题了...
- 浏览器是先尝试匹配最长的哈希,因为它更安全,还是先匹配最短的哈希,因为它更快?
- 真的会期望 一个 哈希匹配而不是所有三个(除了开发人员错误输入哈希的小例子)?
- 提供所有三个哈希而不是只提供一个有什么好处?
- 类似于#1,如果你只提供一个哈希值,你应该使用哪个?我通常会看到网站(例如,Bootstrap)在其示例代码中提供 sha384 值。是因为它在中间,不大也不小?
- 出于好奇,
integrity属性能否用于除<script>和<link>之外的任何标签。我特别想知道<img>、<source>等多媒体标签。
【问题讨论】:
标签: html hash subresource-integrity