logo
bars

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 服务提供了现成的库,便于在 Python、JavaScript (Node.js) 和 C# 语言中进行开发。

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

Python
JavaScript
C#
python
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import AmazonWafRequest
# from capmonstercloudclient.requests.baseRequestWithProxy import ProxyInfo  # 如果计划使用代理,请取消注释
API_KEY = "YOUR_API_KEY"  # 指定您的 CapMonster Cloud API 密钥
async def solve_amazon_waf_captcha():
    client_options = ClientOptions(api_key=API_KEY)
    cap_monster_client = CapMonsterClient(options=client_options)
    # 不使用代理的基本示例
    # CapMonster Cloud 自动使用其自带代理
    amazon_waf_request = AmazonWafRequest(
        websiteUrl="https://example.com",  # 受 AWS WAF 保护的页面 URL
        challengeScript="https://example.com/path/to/challenge.js",  # 替换为正确的值
        captchaScript="https://example.com/path/to/captcha.js",
        websiteKey="your_website_key",
        context="your_context_value",
        iv="your_iv_value",
        cookieSolution=False
    )
    # 使用您自己的代理的示例
    # 如果您想使用自己的代理,请取消注释此块
    # proxy = ProxyInfo(
    #     proxyType="http",
    #     proxyAddress="127.0.0.1",
    #     proxyPort=8080,
    #     proxyLogin="username",
    #     proxyPassword="password"
    # )
    #
    # amazon_waf_request = AmazonWafRequest(
    #     websiteUrl="https://example.com",
    #     challengeScript="https://example.com/path/to/challenge.js",
    #     captchaScript="https://example.com/path/to/captcha.js",
    #     websiteKey="your_website_key",
    #     context="your_context_value",
    #     iv="your_iv_value",
    #     cookieSolution=False,
    #     proxy=proxy
    # )
    # 如有必要,可以检查余额
    balance = await cap_monster_client.get_balance()
    print("Balance:", balance)
    result = await cap_monster_client.solve_captcha(amazon_waf_request)
    print("Solution:", result)
asyncio.run(solve_amazon_waf_captcha())
解决方案、获取参数及设置 Cookie
Node.js 示例,用于在您的网页上进行完整的验证码识别循环。可能的方法:使用 HTTP 请求获取 HTML 和防护系统参数,发送响应并处理结果。或者借助自动化工具(例如 Playwright)— 打开页面,等待验证,通过 CapMonster Cloud 客户端发送参数,获取结果,将 Cookies 代入浏览器(测试时可以使用正确或错误的数据),然后查看结果。
python
// 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 的常见问题

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

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

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

  • false — 响应包含 captcha_voucher 和 existing_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 持续出现,请使用更新后的参数创建新任务,而不是重复使用旧解决方案。