我如何确保我通过CDN交付的JavaScript文件不会被更改?

2022-09-04 00:00:00 code-signing javascript

我正在处理一个场景,其中一些JavaScript文件将托管在CDN上。我希望有一些机制,这样当这些文件在用户端下载时,我可以确保这些文件没有被篡改,并且确实来自指定的CDN。

我知道如果我使用SSL,这项任务会非常容易,但我仍然希望确保即使在不使用SSL的HTTP上也能提供正确的文件。

就我所能搜索到的,目前还没有像跨平台支持的JavaScript文件数字签名这样的现有机制。也许不需要它?

浏览器中是否内置了一些方法来验证JavaScript文件的作者?我可以做些什么来以安全的方式完成此操作?


解决方案

事实上,这样的功能是currently being drafted在子资源完整性的名称下。查看<script>标记的integrity属性。While not yet fully adopted across the board,它正好实现了这一目的。

integrity

包含内联元数据,用户代理可以使用这些元数据来验证已获取的资源是否已在没有意外操作的情况下交付。请参见子资源完整性。

Source

子资源完整性(SRI)是一种安全功能,使浏览器能够验证它们获取的文件(例如,从CDN)是否在没有意外操作的情况下交付。它的工作方式是允许您提供提取的文件必须匹配的加密哈希。

Source


示例:

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

但是请注意,如果您通过纯HTTP传输资源,将不会保护您免受Man in the Middle attacks的影响。在这种情况下,攻击者可以伪造哈希代码,从而使防御被篡改的脚本文件变得毫无用处。

因此,除了上述安全措施外,您应该始终使用安全HTTPS连接,而不是纯HTTP。

相关文章