Scarnox · Blog

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 控制台允许你调整触发挑战的规则。最有用的选项包括:

如果你在测试自己的网站,最干净的方法是为测试执行机加入白名单。不要试图绕过你并不控制的网站上的挑战。这是网站所有者的保护措施,也是最先会切断你访问权限的东西。

Scarnox 的支持现状

因此,如果你获准访问的某个网站目前显示 AWS WAF 挑战,可选的方案就是上面提到的那些:放慢速度,如果网站属于你,就使用白名单,或者向网站所有者申请 API 或数据源。你可以注册账户,获得免费试用额度(无需信用卡),现在就搭建你的 PopularCaptcha 流程,并在 AWS WAF 支持上线时做好准备。当前价格请查看定价页面。

测试你自己的 AWS WAF 站点

如果你是网站所有者,并希望自动化测试能够通过防火墙,同时又不削弱对真实访客的保护,请使用防火墙自带的工具,而不是绕过挑战:

这些步骤能让防火墙保持有效,同时让测试流量变得可预测,而这正是你真正需要的结果。每次修改测试环境后都应复查规则,因为上个月对测试执行机正确的规则,现在可能会把它们拦截。

负责任地抓取

如果你访问 AWS WAF 页面的原因是为了收集数据:

下一步