【问题标题】:Content Security Policy / Subresource Integrity for <a> tags?<a> 标签的内容安全策略/子资源完整性?
【发布时间】:2018-06-12 06:54:33
【问题描述】:

我拥有一个网站,允许用户下载存储在内容分发网络 (CDN) 上的文件。从我的站点到 CDN 上文件的链接类似于 &lt;a href=https://cdndomain.com/path/to/file&gt;。我想为我的用户提供一种方法来确保该文件没有被 CDN 操纵。

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

我知道 Chrome、Firefox 和 Safari 现在支持 Content Security Policy (CSP) 和 Subresource Integrity (SRI)。使用 CSP/SRI,网站可以通过在 &lt;script&gt; 中包含目标文件的哈希值来确保在其他地方托管并由 &lt;script&gt;&lt;link&gt; 标签引用的 .js 文件、.css 文件等未被操纵或使用integrity 属性的&lt;link&gt; 标签,例如:

<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 下载文件后,浏览器获取文件的哈希值并检查此哈希值是否与 &lt;script&gt;&lt;link&gt; 标签的 integrity 属性中提供的哈希值匹配。如果哈希不匹配,浏览器会警告用户并且不执行脚本或应用 css 样式表。

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

有人知道解决办法吗?

【问题讨论】:

  • 这个问题可以通过使用 javascript 函数来解决,该函数从提供受信任校验和的同一服务器提供,以验证来自不受信任服务器的下载的完整性。请参阅meixler-tech.com/aivwd 了解更多信息。

标签: security hash content-security-policy subresource-integrity


【解决方案1】:

SRI 和 CSP 都不是为此而生的;该项目实际上并未加载到页面上,因此它们都不会真正触发,不是因为无论如何都可以在 &lt;a&gt; 标记上指定要求。

这两者都不完全是安全向量;这些旨在阻止恶意代码在浏览器中运行。一旦你下载了一个文件,除非它触发了内置的 Chrome“可疑下载”警告,否则你几乎只能靠自己了。

我会说你的选择是:

A) 提供一个页面,用户可以在该页面上上传文件以为他们生成所述哈希,当你在后台时,不妨实际匹配它并生成一条消息,说“这与 X 的哈希匹配文件!”

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

您选择哪一个取决于您要付出多少努力以及放弃 CDN 的实用性。显然 A) 让您保留 CDN,但更多的是编程,B) 基本上没有编程,但在逻辑上可能非常容易或完全不可能。

【讨论】:

    【解决方案2】:

    看看这个脚本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">
    

    【讨论】:

    猜你喜欢
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2021-12-24
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多