标签的内容安全策略/子资源完整性<a>?



我托管一个网站,允许用户下载存储在内容分发网络(CDN)上的文件。 从我的网站到CDN上文件的链接类似于<a href=https://cdndomain.com/path/to/file>。 我希望我的用户有一种方法来确保该文件未被 CDN 操纵。

当然,我可以在我的网站上发布文件的哈希值(当然,它受SSL/TLS保护)。 然后,在用户下载文件后,他们可以获取文件的哈希值,并验证它是否与我的网站上发布的哈希值匹配。 这种情况并不少见。 但是,我的许多用户都不够精明,无法理解此过程。 而且,即使对于那些人来说,这个过程也有些麻烦。 我正在寻找一种更自动化/更方便的方法来确保文件未纵。

我知道内容安全策略(CSP)和子资源完整性(SRI)现在由Chrome,Firefox和Safari支持。 使用 CSP/SRI,站点可以确保在其他地方托管并由<script><link>标记引用的.js文件、.css文件等未纵,方法是使用integrity属性在<script><link>标记中包含目标文件的哈希,例如:

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/css/bootstrap.min.css" integrity="sha384-Zug+QiDoJOrZ5t4lssLdxGhVrurbmBWopoEl+M6BdEfwnCJZtKxi1KgxUyJq13dy" crossorigin="anonymous">

这非常方便,因为浏览器检查目标文件的哈希是否与integrity属性"幕后"中指定的哈希匹配,而无需任何用户干预。 从 CDN 下载文件后,浏览器会获取文件的哈希值,并检查此哈希值是否与<script><link>标记的integrity属性中提供的哈希值匹配。 如果哈希不匹配,浏览器会警告用户,并且不会执行脚本或应用 css 样式表。

我正在寻找类似的东西来寻找<a>标签中引用的资源——我可以在<a>标签中指定目标资源的哈希,浏览器会在从 CDN 下载资源后但在将其提供给用户之前执行类似的检查,并在哈希不匹配时警告用户。 但根据上面引用的 MDN 文档,CSP 和 SRI 仅适用于<script>标签和<link>标签,不适用于<a>标签。

有谁知道解决方案?

SRI 和 CSP 都不是为此而生的; 该项目实际上并未加载到页面上,因此它们都不会实际触发,无论如何都有办法指定对<a>标签的要求。

它都不完全是这些安全载体;这些旨在阻止恶意代码在浏览器中运行。下载文件后,除非它触发内置的Chrome"可疑下载"警告,否则您几乎只能靠自己。

我会说你的选择是:

A) 提供一个页面,用户可以在其中上传文件以为他们生成所述哈希值,当您在后台时,不妨实际匹配它并生成一条消息,上面写着"这与 X 文件的哈希匹配!

B) 放弃 CDN。根据定义,他们是中间人,因此要完全信任TLS,您需要将文件直接交付给用户,或者至少完全控制CDN。

你选择哪个取决于你想付出多少努力以及放弃你的CDN的实用程度。显然,A)可以保留CDN,但编程更多,B)基本上无需编程,但在逻辑上可能非常容易或完全不可能。

看看这个脚本 https://github.com/ShopupStore/IntegrityChecker,即使它是用于图像的,你也会得到实现它为标签的想法。此脚本使用 sha256 polyfill 为目的,最终标记可能如下所示

<a data-href="https://cdn.example.com/1.jpg" data-hash="496aa8990b87f584dffc43e5953d38abcbc30a2edab131fd304fec43d6d9b289" data-fallback="https://example.com/1.jpg" class="link">

最新更新