跳到主要内容
博客安全性减少延迟而非安全

减少延迟,而非安全性

一幅插图显示了一个秒表和一个盾牌,盾牌上有一个复选标记,上面写着 "减少延迟,而不是安全"。

内容安全策略(CSP)是网络浏览器中实现的一种安全功能,用于保护网站和网络应用程序免受各种类型的攻击,如跨站脚本攻击(XSS)和数据注入攻击。CSP 可控制和限制在网页上加载或执行的不同类型内容的来源。这些内容类型包括

  • 脚本
  • 样式表
  • 镜像

在本篇文章中,我们将首先了解 CSP 的工作原理。我们将看到,更有效、更动态地使用 CSP 包括一些需要在服务器上进行的计算。不过,可以将这些计算转移到边缘,从而减少延迟并确保最佳的终端用户体验。我们还将探讨这种边缘计算解决方案的工作原理。

您准备好了吗?让我们先来了解一下 CSP 的工作原理。

CSP 如何工作

CSP 通常是通过在服务器端添加一个 Content-Security-Policy 标头。这是由网络服务器发送给请求网页的用户的。该标头指定了浏览器在加载和执行页面内容时应遵循的规则。

设置 Content-Security-Policy 页眉

假设您在Node.js 中使用 Express。您可以这样设置 CSP 标头:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.set('Content-Security-Policy', 'directive1 value1; directive2 value2; ...');
  res.status(200).send('hello world');
});

如果您将Python 与 Flask 结合使用,那么代码会如下所示:

app = Flask(__name__)

@app.route('/hello', methods=['GET'])
def hello_world():
    response = make_response('hello world')
    response.headers['Content-Security-Policy'] = 'directive1 value1; directive2 value2; ...'
    return response

使用指令

每个 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,它可以创建一种无服务器体验,实现我们在本文中讨论的功能--而无需自行解决如何在网络边缘部署服务器的复杂问题。

如果您想亲自体验一下,请立即注册免费试用!是时候使用更好的 CSP 标头来保护你的网站了,它不会破坏你的缓存方案!

注释

留下回复

您的电子邮件地址将不会被公布。 必须填写的字段被标记为*