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 管理员界面的快速入门指南。