我正在研究将一些JavaScript文件托管在CDN上的情况。我希望具有某种机制,以便在用户端下载这些文件时,可以确保文件没有被篡改并且确实来自指定的CDN。
我知道如果使用SSL,该任务非常容易,但是,我仍然要确保即使在没有SSL的HTTP上也可以提供正确的文件。
据我搜索,目前尚无跨平台支持的机制,例如JavaScript文件的数字签名。也许不需要?
浏览器是否内置某些方法来验证JavaScript文件的作者?我有什么办法可以安全地做到这一点?
我正在研究将一些JavaScript文件托管在CDN上的情况。我希望具有某种机制,以便在用户端下载这些文件时,可以确保文件没有被篡改并且确实来自指定的CDN。
我知道如果使用SSL,该任务非常容易,但是,我仍然要确保即使在没有SSL的HTTP上也可以提供正确的文件。
据我搜索,目前尚无跨平台支持的机制,例如JavaScript文件的数字签名。也许不需要?
浏览器是否内置某些方法来验证JavaScript文件的作者?我有什么办法可以安全地做到这一点?
Answers:
实际上,目前正在以Subresource Integrity的名称起草这样的功能。查看标记的integrity
属性<script>
。 尽管尚未全面采用,但它可以满足此目的。
integrity
包含内联元数据,用户代理可使用这些内联元数据来验证获取的资源是否已交付,没有意外操作。请参阅子资源完整性。
子资源完整性(SRI)是一项安全功能,它使浏览器可以验证是否已传递他们获取的文件(例如,从CDN获取)而没有意外的操作。通过允许您提供读取的文件必须匹配的加密散列,它可以工作。
例:
<script src="https://example.com/example-framework.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"></script>
但是请注意,如果通过纯HTTP传输资源,这将无法保护您免受中间人攻击。在这种情况下,攻击者可以欺骗哈希码,从而使针对操纵脚本文件的防御无济于事。
因此,除了上述安全措施之外,还应该始终使用安全HTTPS连接而不是普通HTTP。
https://code.jquery.com/
,那么任何受到威胁的人都code.jquery.com
可以XSS您的站点,而不管是否code.jquery.com
通过HTTPS对其进行访问。有了这些检查,攻击者只能阻止脚本的加载,而不能用恶意脚本替换。
您正在寻找子资源完整性检查。
例如,这是jQuery CDN片段:
<script src="https://code.jquery.com/jquery-3.1.0.js"
integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
crossorigin="anonymous"></script>
code.jquery.com
。这样可以保护您免受损害code.jquery.com
。
免责声明:与往常一样,您仅应在使用https时考虑这些机制,因为可以通过MitM和http轻松禁用它们。
除了上述答案中的机制之外,您还可以在父页面上使用内容安全策略 http响应标头。
http://www.html5rocks.com/zh-CN/tutorials/security/content-security-policy/
内容安全政策:script-src'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng ='
这里有几件事要注意。sha *-前缀指定用于生成哈希的算法。在上面的示例中,使用了sha256-。CSP还支持sha384-和sha512-。生成哈希时,请勿包含标签。大写和空格也很重要,包括前导或尾随空格。
使用Chrome 40或更高版本,您可以打开DevTools,然后重新加载页面。对于每个内联脚本,“控制台”选项卡将包含带有正确的sha256哈希值的错误消息。
这种机制已经存在了很长一段时间,因此对浏览器的支持可能还不错,只需检查一下即可。
此外,如果要确保不兼容的较旧版本的浏览器不是不安全的,则可以在策略不允许的页面顶部包含同步重定向脚本。
如果您的对手模型允许攻击者修改从CDN传递来的JavaScript文件,则您的对手模型允许攻击者修改传递来的参考源以消除任何验证尝试,从而将源地址更改为CDN和/或完全删除对JavaScript的引用。
而且,不要让蠕虫打开您的应用程序如何通过HTTP请求(或任何其他没有经过验证的信任链的机制)确定用户的解析器是否正确解析为CDN的蠕虫。
/ etc / hosts:
# ...
1.2.3.4 vile-pirates.org trustworthy.cdn
# ...
您可以使用子资源完整性来确保这一点。许多公共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%的浏览器都支持此功能。关于犬的更多细节。