Chrome,Firefox和Safari现在支持<a> tags?

时间:2018-01-02 14:57:13

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

I host a website that allows users to download a file that is stored on a content distribution network (CDN). The link to the file on the CDN from my site is something like <a href=https://cdndomain.com/path/to/file>. I’d like to have a way for my users to ensure that file has not been manipulated by the CDN.

Of course, I can publish a hash of the file on my site (which of course is secured by SSL/TLS). Then, after the user downloads the file, they can take a hash of the file and verify that it matches the hash published on my site. This is not uncommon. But, many of my users are not savvy enough to understand this process. And, even for those that are, this process is somewhat cumbersome. I’m looking for a more automated/convenient way to ensure that file has not been manipulated.

I know that Content Security Policy(CSP)和Subresource Integrity(SRI)的内容安全政策/子资源完整性。通过使用CSP / SRI,站点可以确保未在<script><link>标记引用的其他位置托管的.js文件,.css文件等,包括目标文件的哈希值使用<script>属性的<link>integrity标记,例如:

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

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

有谁知道解决方案?

2 个答案:

答案 0 :(得分:0)

SRI和CSP都不是真的为此做出的;该项目实际上并未在页面上加载,因此它们实际上都不会触发,因此无论如何都无法指定<a>标记的要求。

它们中的任何一个都不是安全向量;这些是为了阻止恶意代码在浏览器中运行。一旦您下载了一个文件,除非它触发了内置的Chrome&#34;可疑下载,否则您自己就可以自己动手了。警告。

我想说你的选择是:

A)提供一个页面,用户可以在其中上传文件以为他们生成所述哈希值,并且,当您在引擎盖下时,也可以实际匹配它并生成一条消息,其中显示&#34; this匹配X文件的哈希!&#34;

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

您选择哪种方法取决于您想要投入多少努力以及放弃CDN的实际可行性。很明显A)让你保持你的CDN,但更多的编程,B)基本上没有编程,但可能非常容易或完全不可能在后勤。

答案 1 :(得分:-1)

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