CSRF 过滤器

跨站点请求伪造 (CSRF) 是一种攻击,当恶意第三方网站利用漏洞时,它可以代表用户提交不必要的请求。为了减轻此攻击,此过滤器会检查请求的来源,以确定请求的来源是否与其目的地相同。

为了帮助演示前端 Envoy 如何强制执行 CSRF 策略,我们发布了一个 docker compose 沙盒,它部署了一个具有前端和后端的服务。此服务将在具有不同来源的两个不同的虚拟机上启动。

前端有一个字段用于输入您要发送 POST 请求的远程域,以及用于选择远程域的 CSRF 强制执行的单选按钮。CSRF 强制执行选项是

  • 禁用:在请求的路由上禁用 CSRF。由于没有 CSRF 强制执行,因此将导致成功请求。

  • 影子模式:在请求的路由上未强制执行 CSRF,但会记录请求是否包含有效的源来源。

  • 启用:启用 CSRF,当从不同来源发出请求时,将返回 403(禁止)状态代码。

  • 忽略:启用 CSRF,但请求类型为 GET。这应该绕过 CSRF 过滤器并成功返回。

步骤 1:启动所有容器

更改到 examples/csrf/samesite 目录,并启动容器

$ pwd
envoy/examples/csrf/samesite
$ docker compose pull
$ docker compose up --build -d
$ docker compose ps

          Name                        Command              State                                Ports
---------------------------------------------------------------------------------------------------------------------------------
samesite_front-envoy_1      /docker-entrypoint.sh /bin ... Up           10000/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:8001->8001/tcp
samesite_service_1          python3 /code/service.py   ... Up (healthy)

现在,切换到 csrf 示例中的 crosssite 目录,并启动容器

$ pwd
envoy/examples/csrf/crosssite
$ docker compose up --build -d
$ docker compose ps

          Name                       Command                State                   Ports
----------------------------------------------------------------------------------------------------------
crosssite_front-envoy_1      /bin/sh -c /usr/local/bin/ ... Up           10000/tcp, 0.0.0.0:8002->8000/tcp
crosssite_service_1          python3 /code/service.py   ... Up (healthy)

步骤 2:测试 Envoy 的 CSRF 功能

您现在可以在 https://127.0.0.1:8002 上打开浏览器以查看您的 crosssite 前端服务。

输入 samesite 机器的 IP 以演示跨站点请求。启用强制执行的请求将失败。默认情况下,此字段将填充 localhost

为了演示同站点请求,请打开 samesite 的前端服务,地址为 https://127.0.0.1:8000,并将 samesite 机器的 IP 地址作为目标输入。

跨站点请求的结果将显示在页面上的“请求结果”下。您浏览器的 CSRF 强制执行日志可以在浏览器控制台和网络选项卡中找到。

例如

Failed to load resource: the server responded with a status of 403 (Forbidden)

如果将目标更改为与显示网站的目标相同,并将 CSRF 强制执行设置为启用,则请求将成功通过。

步骤 3:通过管理界面检查后端的统计数据

当 Envoy 运行时,如果配置了端口,它可以监听 admin 请求。在示例配置中,后端管理绑定到端口 8001

如果您浏览到 https://127.0.0.1:8001/stats,您将能够查看后端的所有 Envoy 统计信息。您应该看到当您从前端集群发出请求时,无效和有效来源的 CORS 统计信息会增加。

http.ingress_http.csrf.missing_source_origin: 0
http.ingress_http.csrf.request_invalid: 1
http.ingress_http.csrf.request_valid: 0

另见

Envoy 管理员快速入门指南

Envoy 管理员界面的快速入门指南。