我如何确保通过CDN传递的JavaScript文件不被更改?

我正在处理一些JavaScript文件将在CDN上承载的scheme。 我想有一些机制,以便当这些文件在用户端下载时,我可以确保文件没有被篡改,确实来自指定的CDN。

我明白,如果我使用SSL,任务是非常简单的,但是,我仍然希望确保即使在不使用SSL的HTTP上也能够正确地提供正确的文件。

据我所知,目前还没有像跨平台支持的JavaScript文件数字签名这样的机制。 也许不需要?

是否有一些内置到浏览器的方法来validationJavaScript文件的作者? 有什么我可以做的,以安全的方式做到这一点?

事实上, 目前正在以“子资源完整性”Subresource Integrity)的名义起草这样的function。 查看<script>标记的integrity属性。 虽然尚未完全被全面采纳 ,但它实现了这个目的。

integrity

包含内联元数据,用户代理可以使用这些内联元数据来validation提取的资源是否已经交付,没有意外的操作。 请参阅子资源完整性。

资源

子资源完整性(SRI)是一项安全function,它使浏览器能够validation它们提取的文件(例如来自CDN)的传送是否没有意外的操作。 它的工作原理是允许您提供一个获取文件必须匹配的encryption散列。

资源


例:

 <script src="https://example.com/example-framework.js" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous"></script> 

但是请注意,如果您通过普通的HTTP传输资源,这将无法保护您免受中间人攻击 。 在这种情况下,哈希代码可能被攻击者欺骗,使对被操纵的脚本文件的防御无用。

出于这个原因,除了上述的安全措施之外,您应该始终使用安全的HTTPS连接,而不是普通的HTTP。

您正在寻找子资源完整性检查。

例如,以下是jQuery CDN片段:

 <script src="jquery-3.1.0.js" integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk=" crossorigin="anonymous"></script> 

免责声明:与往常一样,您应该只考虑这些机制在使用https时有任何用处,因为它们可以通过MitM通过http

除上述答案中的机制之外,还可以在父页面上使用内容安全性策略 http响应标头。

http://www.html5rocks.com/en/tutorials/security/content-security-policy/

Content-Security-Policy:script-src'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng ='

这里有几点需要注意。 sha * – 前缀指定用于生成散列的algorithm。 在上面的例子中,使用了sha256-。 CSP也支持sha384-和sha512-。 生成哈希时不包含标签。 大小写和空格也是重要的,包括前导或尾随空格。

使用Chrome 40或更高版本,您可以打开DevTools,然后重新加载您的页面。 控制台选项卡将包含错误消息,每个内联脚本都有正确的sha256散列。

这个机制已经有相当长的一段时间了,所以浏览器支持可能相当不错,只要一定要检查一下。

此外,如果您希望确保旧的不兼容浏览器不安全,则可以在页面顶部包含策略不允许的同步redirect脚本。

关于这种签名可以做什么和不可以做什么有一个重要的观点。 它可以保护用户免受假设的攻击,其中有人修改你的代码。 它不能保证你的网站你的代码是正在执行的代码。 换句话说,你仍然不能相信任何来自客户端的东西。

如果您的攻击者模型允许攻击者修改从CDN提供的JavaScript文件,那么攻击者模型允许攻击者修改引用来源,以便移除任何validation尝试,将源地址更改为CDN和/或完全删除对JavaScript的引用。

并且不要打开应用程序如何通过HTTP请求(或任何其他没有经过validation的信任链的机制)来确定用户的parsing程序是否正确parsingCDN的蠕虫病毒jar。

/ etc / hosts中:

 # ... 1.2.3.4 vile-pirates.org trustworthy.cdn # ...