我正在开发一些场景,其中一些JavaScript文件将托管在CDN上。我希望有一些机制,以便在用户端下载这些文件时,我可以确保文件没有被篡改,并且确实来自指定的CDN。
我知道如果我使用SSL,任务很容易,但我仍然希望确保即使在没有SSL的HTTP上也能提供正确的文件。
就我可以搜索而言,没有现成的机制,如JavaScript文件的数字签名,跨平台支持。也许不需要它?
浏览器内置了一些方法来验证JavaScript文件的作者吗?我能以安全的方式做些什么吗?
答案 0 :(得分:139)
事实上,像 Subresource Integrity 这样的功能是currently being drafted。 查看integrity
代码的<script>
属性。 While not yet fully adopted across the board,它实现了此目的。
<强>
integrity
强>包含内联元数据,用户代理可以使用该元数据来验证已提供的已获取资源是否没有意外操作。请参阅子资源完整性。
子资源完整性(SRI)是一种安全功能,使浏览器能够验证他们提取的文件(例如,来自CDN)是否在没有意外操作的情况下传递。它的工作原理是允许您提供所提取文件必须匹配的加密哈希值。
示例:强>
<script src="https://example.com/example-framework.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"></script>
但请注意,如果您通过普通HTTP传输资源,则此将无法保护您免受Man in the Middle attacks 的攻击。在这种情况下,攻击者可以欺骗哈希码,使得对被操纵的脚本文件的防御无效。
因此,除了上述安全措施外,您应始终使用安全HTTPS连接而不是普通HTTP。
答案 1 :(得分:35)
您正在寻找subresource integrity项支票。
例如,这是jQuery CDN片段:
<script src="https://code.jquery.com/jquery-3.1.0.js"
integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
crossorigin="anonymous"></script>
答案 2 :(得分:6)
免责声明:与往常一样,您应该只考虑这些机制在使用https时有用,因为可以通过MitM使用http轻松禁用它们
除了上述答案中的机制外,您还可以在父页面上使用内容安全策略 http响应标头。
http://www.html5rocks.com/en/tutorials/security/content-security-policy/
Content-Security-Policy:script-src'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng ='
这里有几点需要注意。 sha * - 前缀指定用于生成哈希的算法。在上面的示例中,使用sha256-。 CSP还支持sha384-和sha512-。生成哈希时不包含标记。大写和空白也很重要,包括前导或尾随空格。
使用Chrome 40或更高版本,您可以打开DevTools然后重新加载页面。 “控制台”选项卡将包含错误消息,其中包含每个内联脚本的正确sha256哈希值。
这种机制已存在很长时间了,所以浏览器支持可能还不错,请务必检查。
此外,如果您想确保旧的不兼容的浏览器不安全,您可以在页面顶部包含一个政策不允许的同步重定向脚本。
答案 3 :(得分:3)
关于这种签名能做什么和不能做什么,这是一个重要的观点。它可以保护用户免受某人修改您的代码的假设攻击。 无法向您的网站保证您的代码是正在执行的代码。换句话说,您仍然无法信任从客户端访问您网站的任何内容。
答案 4 :(得分:2)
如果您的攻击者模型允许攻击者修改从CDN传递的JavaScript文件,那么您的攻击者模型允许攻击者修改引用来源,以便删除任何验证尝试,以更改源地址除了CDN之外,和/或完全删除对JavaScript的引用。
并且不要打开你的应用程序可以确定用户的解析器是否通过HTTP请求(或任何其他没有其他机制)正确解析到CDN的蠕虫病毒。经过验证的信任链。)
/ etc / hosts中:
# ...
1.2.3.4 vile-pirates.org trustworthy.cdn
# ...
答案 5 :(得分:1)
您可以使用子资源完整性来确保这一点。许多公共CDN在CDN网站上提供的可嵌入代码中都包含SRI哈希。例如,在PageCDN上,当您在jQuery CDN页面上单击jquery文件时,您可以选择复制URL或使用包含SRI哈希的脚本标记,如下所示:
<script src="https://pagecdn.io/lib/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
在页面加载时,浏览器将发出对此资源的请求,请求完成后,它将匹配接收到的文件的哈希值与脚本标记中作为完整性值给出的哈希值。如果两个哈希值都不匹配,浏览器将丢弃jquery文件。
目前,全球91%的浏览器都支持此功能。有关caniuse的更多详细信息。