内容安全策略(CSP)是网络浏览器中实现的一种安全功能,用于保护网站和网络应用程序免受各种类型的攻击,如跨站脚本攻击(XSS)和数据注入攻击。CSP 可控制和限制在网页上加载或执行的不同类型内容的来源。这些内容类型包括
- 脚本
- 样式表
- 镜像
在本篇文章中,我们将首先了解 CSP 的工作原理。我们将看到,更有效、更动态地使用 CSP 包括一些需要在服务器上进行的计算。不过,可以将这些计算转移到边缘,从而减少延迟并确保最佳的终端用户体验。我们还将探讨这种边缘计算解决方案的工作原理。
您准备好了吗?让我们先来了解一下 CSP 的工作原理。
CSP 如何工作
CSP 通常是通过在服务器端添加一个 Content-Security-Policy
标头。这是由网络服务器发送给请求网页的用户的。该标头指定了浏览器在加载和执行页面内容时应遵循的规则。
设置 Content-Security-Policy
页眉
假设您在Node.js 中使用 Express。您可以这样设置 CSP 标头:
const express = require('express'); |
如果您将Python 与 Flask 结合使用,那么代码会如下所示:
app = Flask(__name__) |
使用指令
每个 CSP 标头可以有多个指令,每个指令可以有适合所提供设置类型的值。这些指令定义了各类资源的安全规则。例如 script-src
指令指定了允许的样式表来源。
请看下面的 CSP 标头:
Content-Security-Policy: default-src 'self'; script-src 'self' https://static.example.com; style-src 'self' 'unsafe-inline'; |
在上面的标题中,我们可以看到三个指令,每个指令都有相应的值。
- ǞǞǞ
default-src
指令,设置为'self'
规定,默认情况下,所有内容都应从与页面本身相同的原点加载。 - ǞǞǞ
script-src
指令允许脚本从同一源 ('self'
)和指定的外部源 (https://static.example.com
). - ǞǞǞ
style-src
指令允许从同一源加载样式表,也允许使用内联样式。
可用指令的列表实际上非常详尽。请点击此处查看。指令包括
font-src
:使用@font-face
frame-src
:嵌套浏览上下文的源,加载到元素中,如<frame>
和<iframe>
img-src
:图像和收藏夹的来源
将 CSP 与 HTML 相结合
一旦在服务器上设置了 CSP 标头,浏览器在加载网页资源时就会执行这些规则。
在 HTML 源代码中,开发人员可以通过内联或引用资源(来自同一源或其他源)来添加元素(如脚本或样式表)。然后,浏览器将检查 CSP 标头,确保这些资源符合定义的规则。如果 CSP 不允许某项资源,浏览器将阻止其包含和执行。
每个请求都是独一无二的
由于 CSP 标头是这样定义的,因此在对某个网页的所有请求中,它们通常都是一致的。单个页面每次请求的详细信息和指令与该页面随后的每次请求相同。
这就提出了一个有趣的问题:我们该如何处理动态的内联脚本和样式?我们可能希望允许执行特定的内联脚本和样式,同时又不开放所有内联脚本和样式。
在这种情况下,可以引入 nonce 值或哈希值,以确保即使脚本或样式的来源没有在 CSP 中明确列出,只要与 CSP 标头指定的 nonce 或哈希值相匹配,仍可执行。
每次请求时,这些 nonce 值或哈希值都会发生变化,因此它们是唯一的。因此,它们需要在服务器上生成和管理。不过,虽然这些 nonces 或哈希值需要在服务器上执行,但它们并不一定需要在网站的主服务器上执行。这就是边缘计算的用武之地。
什么是边缘计算?
边缘计算本质上是一种概念,即某些计算可以设置在网络外缘运行,在地理位置上靠近终端用户。从根本上说,它是一种分布式计算,可以实现更接近实时的计算速度,即使是通过互联网,同时还能减少网络延迟。
利用边缘计算,您可以将关注点转移到离最终用户更近的地方,为 CSP 标头生成非ces 和哈希值,从而缩短用户等待您确保网站安全的时间。
边缘计算如何帮助实现 CSP
CSP 会降低网站运行速度的一个重要原因是,头中的 nonces 会导致缓存丢失,客户的浏览器需要一直访问服务器,网站才能正确生成最新的头。为了解决这个问题,您可以在边缘实例中实现动态 CSP nonce 生成器。这样既能确保缓存仍然有用,又能保证安全。
这种方法的好处包括
- 减少延迟:边缘计算实例生成 nonce 并将其插入请求。现在,已插入 nonce 的请求将继续进入缓存,从而避免了每次请求都需要访问源服务器以获取新响应的情况。
- 分布式安全:使用边缘计算意味着,在客户需要与系统的主服务器和应用程序代码交互之前,您就拥有了额外的安全层。即使您的应用程序存在漏洞,计算 CSP nonce 的边缘计算也能提供额外的安全层,帮助您减轻潜在的问题。
- 易于维护:如果在边缘采用无服务器方法管理 CSP 标头的动态 nonce,就能简化维护任务。特别是,您可以在不修改应用程序代码的情况下管理 CSP 策略。通常,您还可以从中央控制系统管理这类变更,而无需进行任何特殊的代码部署。这些边缘计算功能还可用于多个独立的应用程序,从而将关注点从为每个应用程序工作的特定团队中分离出来,并允许安全专业人员确保正在生成正确的 nonce。
总结
您是否有兴趣进一步了解边缘计算的使用?如果是,请查看Akamai的一些特色产品。特别是EdgeWorkers,它可以创建一种无服务器体验,实现我们在本文中讨论的功能--而无需自行解决如何在网络边缘部署服务器的复杂问题。
注释