我正在对内容交付网络进行一些研究。对于那些不知道的人来说,CDN 是一个大型服务器集合,它们缓存并快速向最终用户提供静态内容,例如图像、css、js 等。CDN 不仅可以缓存内容,还可以通过限制检索内容的网络跳数来显着提高性能。
我正在考虑使用免费的 CDN,但我惊讶地发现在使用它们时有关潜在安全风险的文章、博客或论坛几乎为零。使用免费 CDN 有哪些风险?这些风险是如何降低的?
我正在对内容交付网络进行一些研究。对于那些不知道的人来说,CDN 是一个大型服务器集合,它们缓存并快速向最终用户提供静态内容,例如图像、css、js 等。CDN 不仅可以缓存内容,还可以通过限制检索内容的网络跳数来显着提高性能。
我正在考虑使用免费的 CDN,但我惊讶地发现在使用它们时有关潜在安全风险的文章、博客或论坛几乎为零。使用免费 CDN 有哪些风险?这些风险是如何降低的?
由于您通常从 CDN 加载 CSS、JavaScript 和图形,因此在 CDN 服务器上具有类似 root 权限的任何人(即运行 CDN 的公司)都可以:
所以总而言之,只使用你足够信任的 CDN,不要做那些事情。
@ThiefMaster 的回答很好地列举了使用外部控制的内容的风险——这些内容基本上属于在用户浏览器上执行或显示任意代码和内容的类别。
我将主要关注你的最后一个问题:How are those risk mitigated?
这个问题没有得到解决——此后发生了很多变化(4 年内)。
包含来自 CDN 的外部资源时的主要防御措施是使用子资源完整性 (SRI)。SRI 扩展了两个具有完整性属性的 HTML 元素,该属性包含作者期望加载的资源表示的加密散列。具体来说,这些是<script>
and<link>
元素,通常用于分别包含第三方 Javascript 和 CSS。
例子:
CSS:
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.2/css/bootstrap.min.css" 完整性="sha384-y3tfxAZXuh4HwSYylfB+J125MxIs6mR5FOHAmPBG064zB+AFeWH94NdvaCBm8qnd" 跨域="匿名">
JS:
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.2/js/bootstrap.min.js" 完整性="sha384-vZ2WRJMwsjRMW/8U7i6PWi6AlO1L79snBrmgiDpgIWJ82z8eA5lenwvxbMV1PAh7" crossorigin="anonymous">
可以使用一个或多个哈希,通常使用带有 base64 编码的 openssl 生成。浏览器使用它支持的“最强”浏览器。
当这些浏览器遇到受 SRI 保护的元素时,它们会计算摘要并在与预期结果不匹配时返回网络错误。为了防止 CDN 上的更新,可以设置故障转移到其他 CDN 或您自己的服务器。
您可以在上面注意到的另一个防御是crossorigin="anonymous"
属性的使用。这可以防止您的浏览器将 cookie 发送到 CDN,从而避免CORS 泄漏以及减少请求大小的副作用。
最后,通过设置一个将攻击面仅限于 CDN 的限制可以发现一个非常轻微的好处Content-Security-Policy
,这样即使易受攻击的 CDN 被不同的 JS 文件感染,它也无法直接访问数据(尽管它可以通过CDN)。
除了上面的各种链接,另一个有用的参考是这篇Mozilla Hacks 文章。