最近我发现了一个非常好用的网站来生成外部加载资源的SubResource Integrity (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文档后,我发现
完整性值可以包含多个由空格分隔的哈希。如果与其中一个哈希匹配,资源将被加载。但是,这种匹配是如何进行的呢?在一个 SO 帖子中提出多个问题...
1. 浏览器是否尝试首先匹配最长的哈希,因为它更安全,还是首先匹配最短的哈希,因为它更快? 2. 除了开发人员错误输入哈希的情况外,是否真的期望只有一个哈希匹配而不是所有三个哈希都匹配? 3. 提供所有三个哈希而不仅仅是一个哈希有什么好处吗? 4. 类似于问题 #1,如果您只提供一个哈希值,应该使用哪个?我通常看到网站(例如 Bootstrap)在其示例代码中提供 sha384 值。那是因为它恰好位于中间,既不太大也不太小吗? 5. 出于好奇,
integrity
属性是否可用于除 <script>
和 <link>
之外的任何标记上。我特别想知道多媒体标记,例如 <img>
、<source>
等是否可用。