Amazon AWS WAF
与 CapMonster Cloud

验证码解决方案、网站集成与测试。

Amazon AWS WAF解决方案的定价

验证码
价格 (USD)
$ 1.40
1000 代币
接手一个已经部署 captcha 或其他防护的站点,却无法访问源代码?此时最关心的是使用了哪种方案、配置是否正确以及如何测试。

在本文中,我们尽量回答了所有关键问题。要开始解决问题,第一步是确定当前使用的是哪种防护系统。为此,您可以查看常见验证码与反机器人防护系统列表,其中提供了可视化示例和关键特征,帮助您快速判断自己正在使用哪一种方案。

如果您发现自己的网站使用的是 Amazon AWS WAF,下一步就是更深入地了解它的特性和具体工作方式。在本文中,您还可以查看 Amazon AWS WAF 的接入说明,以便彻底弄清它在您的网站上是如何运行的。这样一来,您不仅能更好地理解当前的防护机制,还可以更合理地规划后续的维护和支持。

什么是 Amazon AWS WAF
什么是 Amazon AWS WAF

AWS WAF (Amazon Web Services Web Application Firewall) 是亚马逊提供的云端 Web 应用程序防火墙,用于保护网站、API 和 Web 应用程序免受攻击和恶意流量的侵害。简单来说,它是一个位于您的网站或 API 前端的过滤器,决定允许哪些访问流量通过,阻止哪些流量。

如果网站启用了 Challenge/CAPTCHA(质询/验证码),访问者可能会看到一个单独的验证页面。系统会要求他完成一项任务,例如选择某一类别的所有图片,以确认他不是机器人。

如何通过 CapMonster Cloud 解除 AWS WAF

在测试受 AWS WAF 保护的资源时,确保防护功能正常运行且集成正确非常重要。

您可以手动检查防护的工作情况:

  • 打开包含表单或资源的页面,确保 AWS WAF 对请求做出正确响应。
  • 尝试执行可能会被 WAF 限制的操作(例如大量请求、可疑的 Header)— 服务器应阻止此类请求或返回错误。

验证通过后,AWS WAF 会设置 Cookies,确认用户或客户端已通过检查并允许受信任的流量通过。

对于自动验证码识别,您可以使用专门的服务,例如 CapMonster Cloud — 这是一个接收验证码参数、在服务器端处理并返回现成 Cookies 或令牌的工具。将它们代入浏览器即可在无需用户参与的情况下通过验证。

通过 CapMonster Cloud API 工作的一般流程:

创建任务创建任务
arrow
发送 API 请求发送 API 请求
arrow
获取结果获取结果
arrow
在页面上代入 aws-waf-token Cookies在页面上代入 aws-waf-token Cookies
arrow
使用现成库识别 Amazon AWS WAF
CapMonster Cloud 服务提供了现成的库,便于在 PythonJavaScript (Node.js)C# 语言中进行开发。

重要提示: 这些代码示例使用 cookieSolution=False。如果结果中您需要获取 Cookies,请设置 cookieSolution=True。

Python
JavaScript
C#
解决方案、获取参数及设置 Cookie
Node.js 示例,用于在您的网页上进行完整的验证码识别循环。可能的方法:使用 HTTP 请求获取 HTML 和防护系统参数,发送响应并处理结果。或者借助自动化工具(例如 Playwright)— 打开页面,等待验证,通过 CapMonster Cloud 客户端发送参数,获取结果,将 Cookies 代入浏览器(测试时可以使用正确或错误的数据),然后查看结果。
// npm install playwright @zennolab_com/capmonstercloud-client
// npx playwright install chromium

import { chromium } from "playwright";
import { CapMonsterCloudClientFactory, ClientOptions, AmazonRequest } from "@zennolab_com/capmonstercloud-client";

const API_KEY = "YOUR_API_KEY";
const CAPTCHA_URL = "https://example.com";

// 代理设置
const PROXY = {
    proxyType: "http",
    proxyAddress: "PROXY_HOST",
    proxyPort: 1234,
    proxyLogin: "PROXY_USER",
    proxyPassword: "PROXY_PASS"
};

(async () => {
    // 1) 通过代理打开页面并收集 AWS WAF 参数
    const browser = await chromium.launch({
        headless: false,
        proxy: {
            server: `http://${PROXY.proxyAddress}:${PROXY.proxyPort}`,
            username: PROXY.proxyLogin,
            password: PROXY.proxyPassword
        }
    });

    const page = await browser.newPage();
    await page.goto(CAPTCHA_URL, { waitUntil: "networkidle" });

    // 等待 challenge 和 captcha 脚本加载
    await page.waitForFunction(() => {
        const scripts = Array.from(document.querySelectorAll("script")).map(s => s.src || "");
        return scripts.some(src => src.includes("challenge")) && scripts.some(src => src.includes("captcha"));
    });

    // 提取 AWS WAF 参数 (key, context, iv, 脚本链接)
    const params = await page.evaluate(() => {
        const gokuProps = window.gokuProps || {};
        const scripts = Array.from(document.querySelectorAll("script")).map(s => s.src || "");
        return {
            websiteKey: gokuProps.key || null,
            context: gokuProps.context || null,
            iv: gokuProps.iv || null,
            challengeScript: scripts.find(src => src.includes("challenge")),
            captchaScript: scripts.find(src => src.includes("captcha"))
        };
    });

    await browser.close();

    // 2) 通过 CapMonster Cloud 解决 AWS WAF
    const client = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: API_KEY }));

    const req = new AmazonRequest({
        websiteURL: CAPTCHA_URL,
        websiteKey: params.websiteKey,
        challengeScript: params.challengeScript,
        captchaScript: params.captchaScript,
        context: params.context,
        iv: params.iv,
        cookieSolution: true,
        proxy: PROXY
    });

    const solved = await client.Solve(req);
    const wafToken = solved.solution.cookies["aws-waf-token"];

    // 3) 代入 aws-waf-token 并清除旧的
    const browser2 = await chromium.launch({
        headless: false,
        proxy: {
            server: `http://${PROXY.proxyAddress}:${PROXY.proxyPort}`,
            username: PROXY.proxyLogin,
            password: PROXY.proxyPassword
        }
    });

    const context2 = await browser2.newContext();

    // 清除您域名的旧 aws-waf-token
    const existingCookies = await context2.cookies();
    const filteredCookies = existingCookies.filter(c => !(c.name === "aws-waf-token" && c.domain.endsWith(".your-domain")));
    await context2.clearCookies();
    await context2.addCookies(filteredCookies);

    // 设置新的 aws-waf-token
    await context2.addCookies([{
        name: "aws-waf-token",
        value: wafToken,
        domain: ".your-domain",
        path: "/",
        httpOnly: false,
        secure: true
    }]);

    const page2 = await context2.newPage();
    const response = await page2.goto(CAPTCHA_URL, { waitUntil: "networkidle" });

    console.log("Final page status:", response.status());
    console.log("Final page URL:", page2.url());

    await browser2.close();
})();
如何将 AWS WAF 连接到您的网站
为了自信地掌握网站上验证码的运行情况,理解其验证逻辑,重新连接或重新配置,建议您学习本节内容。其中描述了连接防护的过程 — 这将帮助您快速理清所有细节。

AWS WAF 无法直接安装在网站上。它只能通过 AWS 资源工作:

  • Amazon CloudFront(主要且最佳选项)— CDN,通过它可以保护任何网站。速度快、全球覆盖,适用于几乎所有情况。
  • Application Load Balancer (ALB) — 用于 AWS 内部的服务器端网站、API 和容器。如果您的后端运行在 EC2, ECS, EKS 上 — 请将 WAF 部署在 ALB 上。
  • API Gateway — 保护 REST 和 WebSocket API。适用于 SPA、移动应用和微服务。
  • AWS AppSync (GraphQL API)
  • Amazon Cognito (登录/注册)
  • AWS App Runner (容器化应用)
  • AWS Amplify Hosting (前端托管)
  • AWS Verified Access (访问内部应用)

步骤 1. 创建 AWS 账户(如果还没有)

前往:https://portal.aws.amazon.com/billing/signup。创建账户 > 验证邮箱和电话。

步骤 2. 您可以使用标准或新的 AWS WAF 界面:

  1. 前往 AWS 控制台
  2. 打开 AWS WAF。在左侧菜单中点击 Try the new experience(如果提示)。

步骤 3. 创建防护包 (Web ACL)

这就是针对您资源的防护规则集。

  1. 在左侧菜单选择:Resources & protection packs (Web ACLs)
  2. 点击 Add protection pack (web ACL)

步骤 4. 配置应用程序类别:

Tell us about your app 块中:

  • App category — 选择 Web / API / Both
  • Traffic source — 流量来源 (Web, API 或两者)

这些参数用于让 AWS 推荐最佳规则。

步骤 5. 选择要保护的资源

  1. 点击 Add resources
  2. 选择您要连接的内容:

如果您的网站在 CloudFront 上 > 选择 CloudFront distributions
如果您的后端在 ALB 上 > 选择 Regional resources
如果是 API > 选择 API Gateway REST API
勾选所需资源 > 点击 Add

步骤 6. 选择初始规则集。

AWS 会建议:

Recommended for you — 新手的最佳选择

它包含:

  • 基础防护
  • 针对 SQLi 和 XSS 的规则
  • IP reputation lists (IP 声誉列表)
  • Bot Control (可选)
  • Web/API 规则

点击 Next

步骤 7. 配置(可选)

Customize protection pack (web ACL) 屏幕上:

主要参数:

  • Default action:
    • Allow all except blocked — 通常选择此项
    • Block all except allowed — 如果网站是封闭的
  • Default rate limits: 请求数量限制 (DDoS L7 缓解)
  • IP addresses: 白名单/黑名单
  • Country specific origins: 按国家/地区限制流量

日志记录 (Logging)

选择日志写入位置:

  • CloudWatch
  • S3
  • Firehose

(建议使用 S3 + Athena)。

步骤 8. 创建 Web ACL

点击:Add protection pack (web ACL)

AWS 将创建规则并将其绑定到您的资源。

验证

为了确保防护正在运行:

  1. 打开 WAF > 选择您的 Web ACL
  2. 前往 Monitoring
  3. 查看:
    • 流量图表
    • 被阻止的请求
    • 样本请求 (sample requests)

附加(可选)

  • 启用 CAPTCHA 或 Challenge

    在任何规则中 > Action > CAPTCHA / Challenge

    这可以减少机器人流量并保护登录和表单页面。

  • 添加 Managed Rule Groups

    Rule groups 部分,您可以添加:

    • AWS Managed
    • Bot Control
    • Account takeover prevention
    • Marketplace rules (F5, Imperva, Fortinet)
  • 关联 Shield Advanced。用于防御 DDoS (L3–L7)。

Background
可能的错误与调试
Bug Icon
域名或规则无效 — Challenge 未显示
检查 AWS WAF WebACL 是否绑定到了正确的域名 (CloudFront Distribution / ALB / API Gateway)、正确的路径,并且规则之间没有冲突。
Bug Icon
页面加载或验证超时
有时浏览器或脚本未等到 AWS WAF 的响应。请增加测试中的超时时间 (timeout),并确保后端处理请求没有延迟。
Bug Icon
AWS WAF Cookies 过期
过期的 _aws_waf_token_… 或相关的 Cookie 标记会导致重复的 Challenge 或暂时封锁。
Bug Icon
规则过于敏感
过于严格的 Bot Control 签名、CAPTCHA 规则或基于速率 (Rate-based) 的规则可能会阻止真实用户。
Bug Icon
WebACL 配置错误
规则顺序、优先级或条件中的错误可能导致误报 (False Positives) 和封锁。
验证防护的可靠性
集成完成后,务必确认系统确实能够抵御自动化行为。
安全与优化建议
根据风险级别配置 WebACL。使用 Managed Rules (AWS, AWS Marketplace)、AWS Bot Control 以及基于 IP 声誉、Header、速率限制和其他条件的自定义规则。
记录 WAF 事件。启用 <a href="https://docs.aws.amazon.com/waf/latest/developerguide/logging.html" target="_blank">AWS WAF Logging (Kinesis Firehose / S3 / CloudWatch Logs)</a> 以分析误报并优化规则。
添加<span class="font-bold">隐私政策</span>和<span class="font-bold">使用条款</span>的链接。这对于透明度以及符合安全要求和用户期望非常重要。
结论

如果你接手了一个已经集成了验证码或其他防护系统的网站,但又无法访问其代码,也不用担心!要判断实际使用了哪种技术其实并不难。为了核实其是否正常工作,你可以在隔离的测试环境中使用CapMonster Cloud识别服务,确保令牌处理机制和校验逻辑都运行正常。

对于Amazon AWS WAF,只需识别出所用的系统,观察其行为,并确认防护是否正常工作即可。本文演示了如何识别 Amazon AWS WAF,以及到哪里查找其接入或重新配置的说明文档,从而帮助你自信地维护防护方案并掌控其运行情况。

Conclusion
实用链接
DocIconAWS WAF 文档DocIconCapMonster Cloud 文档 (与 AWS WAF 协作)DocIcon使用 AWS WAF 保护 Web 资源概览

关于 Amazon AWS WAF 的常见问题

websiteKeycontextiv 的值来自 AWS WAF challenge 页面,可以从该页面的 HTML 中提取,或通过 JavaScript 从 window.gokuProps.keywindow.gokuProps.contextwindow.gokuProps.iv 获取。您可以使用我们的 现成脚本自动提取它们。

这些是当前 challenge 页面与会话相关的参数,不是可在多次尝试间重复使用的通用静态值。

布尔字段 cookieSolution 控制 CapMonster Cloud 返回的 AWS WAF 解决方案格式:

  • false — 响应包含 captcha_voucherexisting_token
  • true — 解决方案包含带有可直接使用的 aws-waf-token 的 cookie

对于 Playwright、Puppeteer 和 Selenium 等浏览器自动化流程,cookieSolution: true 通常是更方便的选项,因为它返回可直接添加到浏览器会话的 cookie。

默认情况下,您无需为 AWS WAF 任务提供自己的代理,因为 CapMonster Cloud 使用内置代理,其费用已包含在服务中。

但是,当目标网站不接受 token 或访问内置服务受限时,您需要指定自己的代理。如果您使用 IP 授权的代理,请确保将地址 65.21.190.34 加入白名单。

有效的 AWS WAF token 不会自动绕过 Web ACL 的其余逻辑。AWS 表示,当请求对 CAPTCHA 或 Challenge 规则拥有有效 token 时,该规则的处理方式类似于 Count 操作,AWS WAF 随后继续根据 Web ACL 中的其余规则评估请求。这意味着 Bot Control、rate-based rules 和其他规则仍可能影响自动化流量,AWS 还单独记录了 Bot Control 的误报场景。

实践中,故障排除应关注规则顺序、规则优先级、token 设置和可能的误报,而不是假设已解决的 CAPTCHA 本身就能保证通过。

重复的 AWS WAF challenge 通常发生在 token 过期、aws-waf-token cookie 缺失或过时、会话免疫时间结束,或未为多域流程配置 token 共享时。

对于网站开发者: 将 CAPTCHA 或 Challenge 免疫时间设置为符合真实用户行为,为相关域配置 token 域列表,验证 AWS WAF JavaScript 集成正确存储 token,并确保更严格的 Web ACL 规则在 CAPTCHA 解决后不会继续阻止合法流量。

对于 CapMonster Cloud 用户: 使用目标页面的最新任务数据,通过 aws-waf-token cookie 或 x-aws-waf-token 标头以所需格式传递结果,如果 challenge 持续出现,请使用更新后的参数创建新任务,而不是重复使用旧解决方案。