AWS WAF 验证码详解及应对方法
AWS WAF 验证码是 Amazon 的 Web 应用防火墙在网站所有者配置了访客校验时下发的一种挑战。防火墙认为可疑的请求,会收到一个挑战页面,而不是正常内容。访客必须先通过校验,真实页面才会加载。如果你在测试或收集数据时遇到它,需要了解如何识别它、网站所有者可以控制哪些选项,以及 Scarnox 目前能做什么。本指南涵盖这三方面。
什么是 AWS WAF 验证码
AWS WAF 是一个规则引擎,部署在 Web 应用前面,可以挂载在 Amazon CloudFront、Application Load Balancer 或 API Gateway 上。规则可以允许、拦截、计数或对请求发起挑战。挑战可以是无感的 JavaScript 校验,也可以是可见的验证码谜题,取决于规则的设置方式。
关键在于,这一决定由网站所有者做出。防火墙并不知道你的爬虫的用途,它只根据所看到的流量进行评分:请求速率、IP 信誉、请求头以及客户端的行为。
如何在代码中识别它
AWS WAF 挑战通常可以通过响应来识别。常见的信号是 x-amzn-waf-action 响应头,挑战往往会在真实页面出现之前以 HTTP 202 状态码返回。请把这些视为信号而非确证,因为各网站对防火墙的配置方式不尽相同:
import requests
def looks_like_aws_waf(resp: requests.Response) -> bool:
# 这只是一个 header 信号,并非确证。请对照你正在测试的页面加以确认。
return "x-amzn-waf-action" in resp.headers
resp = requests.get("https://example.com/products", timeout=30)
if looks_like_aws_waf(resp):
print("Challenge served. Stop, slow down, and check your request rate.")
else:
print("Status", resp.status_code)
另外,也可以在页面源码中查找从 AWS WAF 挑战路径加载的脚本,以及那些要等脚本运行后才显示内容的页面。普通的 requests 调用往往只会拿到挑战页面,而不是真正的数据。这是正常现象。
网站所有者可以做什么
如果你运营该网站,AWS WAF 控制台允许你调整触发挑战的规则。最有用的选项包括:
- 基于速率的规则,只对发送请求过多的客户端发起挑战,使正常访客可以顺利通过。
- 白名单,为你自己的监控、CI 或合作伙伴的 IP 段开放访问,使你自己的测试不会被挑战。
- 仅对敏感路径发起挑战,例如登录或结账页面,而不是整个网站。
如果你在测试自己的网站,最干净的方法是为测试执行机加入白名单。不要试图绕过你并不控制的网站上的挑战。这是网站所有者的保护措施,也是最先会切断你访问权限的东西。
Scarnox 的支持现状
- 目前可用: 无代理及使用自有代理的 PopularCaptcha。
- 即将推出: AWS WAF,以及 GeeTest、reCAPTCHA v2 和 v3、Cloudflare Turnstile 和 Arkose。在 AWS WAF 求解被列为可用之前,不要设计依赖它的生产流程。
因此,如果你获准访问的某个网站目前显示 AWS WAF 挑战,可选的方案就是上面提到的那些:放慢速度,如果网站属于你,就使用白名单,或者向网站所有者申请 API 或数据源。你可以注册账户,获得免费试用额度(无需信用卡),现在就搭建你的 PopularCaptcha 流程,并在 AWS WAF 支持上线时做好准备。当前价格请查看定价页面。
测试你自己的 AWS WAF 站点
如果你是网站所有者,并希望自动化测试能够通过防火墙,同时又不削弱对真实访客的保护,请使用防火墙自带的工具,而不是绕过挑战:
- 新建一条处于 计数(count) 模式的规则。它会记录那些本会被挑战的请求,但不会影响任何人,因此你可以清楚地看到你的测试触发了哪些情况。
- 开启 WAF 日志,将其输出到 Amazon CloudWatch Logs、Amazon S3 或 Amazon Data Firehose。日志会告诉你是哪条规则匹配,以及哪个请求头或路径触发了它。
- 为测试环境分配独立的预发布域名,并使用单独的规则集,使生产环境保持受保护,同时让测试套件可以自由运行。
- 只将测试执行机实际使用的 IP 段或请求头值加入白名单,并在执行机变更时重新审核该列表。
这些步骤能让防火墙保持有效,同时让测试流量变得可预测,而这正是你真正需要的结果。每次修改测试环境后都应复查规则,因为上个月对测试执行机正确的规则,现在可能会把它们拦截。
负责任地抓取
如果你访问 AWS WAF 页面的原因是为了收集数据:
- 在发送请求之前,阅读网站的
robots.txt和服务条款。 - 保持较低的请求频率。挑战往往就是网站在请求你放慢速度。
- 当网站明确表示不希望被自动化访问时,立即停止。
- 不要收集你没有理由持有的个人数据,对于已经收集的个人数据,应当依照适用的隐私规定进行处理。