Phân Tích Kỹ Thuật

Quy tắc WAF của Cloudflare kích hoạt các thử thách CAPTCHA

Tường lửa ứng dụng web (WAF) của Cloudflare cho phép người vận hành trang web tạo các quy tắc kích hoạt thử thách CAPTCHA dựa trên các thuộc tính yêu cầu cụ thể — địa chỉ IP, quốc gia, đường dẫn URL, điểm bot, tiêu đề hoặc bất kỳ sự kết hợp nào. Việc hiểu những quy tắc nào gây ra thách thức sẽ giúp bạn chẩn đoán lý do tại sao bạn nhìn thấy CAPTCHA và chọn phương pháp phù hợp để xử lý vấn đề đó.


Các hành động quy tắc WAF tạo ra CAPTCHA

Quy tắc WAF của Cloudflare hỗ trợ một số hành động. Ba trong số đó đưa ra những thách thức có thể giải quyết được:

hành động WAF Chuyện gì xảy ra Trạng thái HTTP Phương pháp CaptchaAI
Thử thách được quản lý Cloudflare quyết định: thử thách vô hình, Turnstile hoặc JS 503 turnstile
Thử thách JS Trang thử thách JavaScript 5 giây 503 cloudflare_challenge
Thử thách tương tác CAPTCHA truyền thống (cũ, không được dùng nữa) 403 turnstile
Chặn Khó 403, không có thử thách 403 N/A (không thể giải quyết được)
Cho phép Đi qua, không kiểm tra 200 N/A
Bỏ qua Bỏ qua các quy tắc WAF còn lại 200 N/A
Nhật ký Đăng nhập sự kiện, không có hành động 200 N/A

Thử thách được quản lý (phổ biến nhất)

Thử thách được quản lý là hành động được Cloudflare khuyến nghị. Nó quyết định một cách thích ứng loại thử thách cho mỗi khách truy cập:

WAF rule matches → Managed Challenge triggered
    ↓
Cloudflare evaluates visitor:
  ├─ Low risk → Invisible pass (no visible challenge)
  ├─ Medium risk → Turnstile widget (click to verify)
  └─ High risk → JavaScript challenge page
    ↓
Successful → <staging-session-cookie> cookie issued

Các mẫu quy tắc WAF phổ biến

Người vận hành trang web tạo quy tắc WAF bằng ngôn ngữ biểu thức của Cloudflare. Đây là những mẫu có nhiều khả năng kích hoạt CAPTCHA nhất cho lưu lượng truy cập tự động:

Quy tắc tính điểm của Bot

# Challenge traffic with low bot scores
(cf.bot_management.score lt 30)
→ Action: Managed Challenge

# Challenge non-verified bots
(cf.bot_management.score lt 50 and not cf.bot_management.verified_bot)
→ Action: JS Challenge

Quy tắc tính điểm của bot là yếu tố kích hoạt phổ biến nhất cho các công cụ tự động hóa. Trình giải mã API của CaptchaAI nhận được điểm ở cấp độ con người vì họ sử dụng trình duyệt thực.

Quy tắc theo quốc gia

# Challenge traffic from specific countries
(ip.geoip.country in {"CN" "RU" "VN" "IN"})
→ Action: Managed Challenge

# Block specific regions entirely
(ip.geoip.country eq "XX")
→ Action: Block

Quy tắc dựa trên đường dẫn

# Challenge login page access
(http.request.uri.path eq "/login" or http.request.uri.path eq "/signup")
→ Action: Managed Challenge

# Challenge API endpoints
(http.request.uri.path contains "/api/")
→ Action: JS Challenge

Quy tắc dựa trên tỷ lệ

# Challenge after high request rate
(cf.threat_score gt 10 and http.request.uri.path contains "/search")
→ Action: Managed Challenge

Quy tắc dựa trên tiêu đề

# Challenge requests with no Accept-Language header
(not http.request.headers["accept-language"])
→ Action: JS Challenge

# Challenge requests with suspicious UA
(http.user_agent contains "python" or http.user_agent contains "curl")
→ Action: Managed Challenge

Quy tắc ghép

# Multiple conditions
(cf.bot_management.score lt 30
 and http.request.uri.path contains "/api/"
 and ip.geoip.country ne "US")
→ Action: JS Challenge

Xác định quy tắc nào được kích hoạt

Khi thử thách CAPTCHA xuất hiện, bạn có thể xác định quy tắc kích hoạt từ phản hồi:

Từ tiêu đề HTTP

import requests

def check_cloudflare_rule_info(url):
    """Extract WAF rule information from Cloudflare challenge response."""
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 Chrome/120.0.0.0",
        "Accept": "text/html,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
    }

    response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)

    info = {
        "status": response.status_code,
        "cf_ray": response.headers.get("cf-ray", ""),
        "cf_cache_status": response.headers.get("cf-cache-status", ""),
        "server": response.headers.get("server", ""),
    }

    # Challenge-specific info
    html = response.text

    if response.status_code == 503:
        if "jschl" in html:
            info["challenge_type"] = "JS Challenge (IUAM or WAF rule)"
        elif "challenge-platform" in html:
            info["challenge_type"] = "Managed Challenge"
        elif "cf-turnstile" in html:
            info["challenge_type"] = "Turnstile (Managed Challenge)"

    elif response.status_code == 403:
        if "cf-ray" in str(response.headers):
            info["challenge_type"] = "WAF Block (no challenge)"
        else:
            info["challenge_type"] = "Origin 403 (not Cloudflare)"

    return info

Từ ID Cloudflare Ray

Mọi phản hồi của Cloudflare đều bao gồm tiêu đề cf-ray. Người vận hành trang web có thể sử dụng ID Ray này trong bảng điều khiển của Cloudflare (Bảo mật > Sự kiện) để xem chính xác quy tắc nào đã kích hoạt và hành động nào đã được thực hiện.


Giải quyết các thách thức do WAF kích hoạt

Chiến lược dựa trên loại thử thách

import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_cloudflare_challenge(url, challenge_type):
    """Solve Cloudflare challenge based on WAF rule action."""

    if challenge_type == "managed_challenge":
        # Managed Challenge typically renders as Turnstile
        method = "turnstile"
        sitekey = extract_turnstile_sitekey(url)
    elif challenge_type == "js_challenge":
        # JavaScript Challenge page
        method = "cloudflare_challenge"
        sitekey = "managed"
    else:
        raise ValueError(f"Unknown challenge type: {challenge_type}")

    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": method,
        "sitekey": sitekey,
        "pageurl": url,
        "json": 1,
    })

    task_id = submit.json()["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }).json()

        if result.get("status") == 1:
            return result["request"]

    raise TimeoutError("Challenge solve timed out")

def extract_turnstile_sitekey(url):
    """Fetch page and extract Turnstile sitekey."""
    import re
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 Chrome/120.0.0.0",
    }
    response = requests.get(url, headers=headers, timeout=15)
    match = re.search(r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', response.text)
    return match.group(1) if match else None

Node.js

const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

async function solveWAFChallenge(url, challengeType) {
  const method =
    challengeType === "js_challenge" ? "cloudflare_challenge" : "turnstile";
  const sitekey =
    challengeType === "js_challenge" ? "managed" : await extractSitekey(url);

  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: {
      key: API_KEY,
      method,
      sitekey,
      pageurl: url,
      json: 1,
    },
  });

  const taskId = submit.data.request;

  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));

    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId, json: 1 },
    });

    if (result.data.status === 1) {
      return result.data.request;
    }
  }

  throw new Error("Challenge solve timed out");
}

async function extractSitekey(url) {
  const response = await axios.get(url, {
    headers: {
      "User-Agent": "Mozilla/5.0 Chrome/120.0.0.0",
    },
  });
  const match = response.data.match(/data-sitekey=["']([0-9x][A-Za-z0-9_-]+)["']/);
  return match ? match[1] : null;
}

Những thay đổi về quy tắc WAF và tác dụng của chúng

Người vận hành trang web thường xuyên điều chỉnh các quy tắc WAF. Những thay đổi này ảnh hưởng đến tự động hóa:

Thay đổi Hiệu ứng tự động hóa Làm thế nào để phát hiện
Đã thêm quy tắc Thử thách mới xuất hiện trên những con đường đã hoạt động Theo dõi các thay đổi trạng thái 503/403
Đã xóa quy tắc Thử thách biến mất 200 ở vị trí 503 trước đây
Hành động leo thang (Khối → được quản lý) Thử thách có thể giải quyết được trở thành khối cứng 403 thay vì 503
Thư giãn hành động (Quản lý khối →) Khối cứng trở thành thách thức có thể giải quyết được 503 với trang thử thách
Ngưỡng đã thay đổi (điểm bot 30 → 50) Nhiều yêu cầu bị thách thức hơn Tăng tần suất thử thách
Phạm vi đường dẫn đã thay đổi Các URL khác nhau bị ảnh hưởng Những con đường mới mang lại thử thách

Chiến lược giám sát

import requests
import time

def monitor_cloudflare_protection(urls, interval=3600):
    """Monitor protection changes across URLs."""
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 Chrome/120.0.0.0",
        "Accept": "text/html,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
    }

    last_status = {}

    while True:
        for url in urls:
            try:
                response = requests.get(
                    url, headers=headers, timeout=15, allow_redirects=False
                )
                status = response.status_code
                has_challenge = status == 503 or "cf-turnstile" in response.text

                current = {"status": status, "challenge": has_challenge}
                previous = last_status.get(url)

                if previous and current != previous:
                    print(f"[CHANGE] {url}")
                    print(f"  Before: {previous}")
                    print(f"  After:  {current}")

                last_status[url] = current

            except requests.RequestException as e:
                print(f"[ERROR] {url}: {e}")

        time.sleep(interval)

Khắc phục sự cố

Triệu chứng Có khả năng quy tắc WAF sửa chữa
Thử thách chỉ có trên /login Quy tắc dựa trên đường dẫn Giải quyết thử thách cho con đường đó
Thử thách chỉ từ IP trung tâm dữ liệu Điểm bot hoặc quy tắc danh tiếng IP Sử dụng đa dạng nguồn yêu cầu hoặc giải quyết thách thức
Thử thách khác nhau tùy theo quốc gia Quy tắc dựa trên quốc gia Sử dụng proxy ở quốc gia được phép hoặc giải quyết
Thử thách sau N yêu cầu Quy tắc dựa trên tỷ lệ Giảm tỷ lệ yêu cầu hoặc giải quyết từng thử thách
Thử thách luôn JS (không bao giờ quay vòng) Hành động Thử thách JS (không được quản lý) Sử dụng phương pháp cloudflare_challenge
403 không có thử thách Hành động chặn (không thể giải quyết được) Thay đổi IP, tiêu đề hoặc mẫu yêu cầu

Câu hỏi thường gặp

Tôi có thể xem các quy tắc WAF mà trang web sử dụng không?

Không. Các quy tắc WAF là riêng tư đối với người điều hành trang web. Bạn chỉ có thể suy ra các quy tắc từ hành vi - đường dẫn nào kích hoạt thử thách, từ IP nào và loại thử thách nào xuất hiện.

Các quy tắc WAF có áp dụng cho tất cả các gói Cloudflare không?

Quy tắc WAF tùy chỉnh có sẵn trên tất cả các gói trả phí (Pro, Business, Enterprise). Các gói miễn phí có các quy tắc WAF hạn chế. Tuy nhiên, Thử thách được quản lý có sẵn trên tất cả các gói bao gồm cả Miễn phí.

Các quy tắc WAF có thể kích hoạt các thách thức khác nhau cho các đường dẫn khác nhau không?

Vâng. Mỗi quy tắc WAF có thể có một hành động khác nhau và khớp với các đường dẫn khác nhau. Một trang web có thể sử dụng Thử thách được quản lý cho /login và Thử thách JS cho điểm cuối /api/.

Các trang web có thường xuyên thay đổi quy tắc WAF của họ không?

Nó khác nhau. Các trang thương mại điện tử thường điều chỉnh quy định trong các sự kiện bán hàng. Các trang web quan tâm đến bảo mật có thể cập nhật các quy tắc hàng tuần. Hầu hết các trang web hiếm khi thay đổi quy tắc sau khi thiết lập ban đầu.

Việc giải quyết thách thức WAF có ảnh hưởng đến các yêu cầu trong tương lai không?

Vâng. Sau khi giải quyết, cookie <staging-session-cookie> cho phép các yêu cầu tiếp theo được vượt qua mà không gặp thách thức trong ~30 phút. Cookie được gắn với IP và Tác nhân người dùng của bạn.


Tóm tắt

Các quy tắc WAF của Cloudflare kích hoạt các thử thách CAPTCHA dựa trên các điều kiện có thể định cấu hình: điểm bot, quốc gia, đường dẫn, tiêu đề hoặc tỷ lệ. Hành động phổ biến nhất là Thử thách được quản lý, mà Cloudflare hiển thị một cách thích ứng dưới dạng thử thách vô hình, Cloudflare Turnstile hoặc JS. Giải quyết những điều này vớiCaptchaAIsử dụng phương pháp turnstile hoặc cloudflare_challenge tùy thuộc vào nội dung được hiển thị. Các khối cứng (403) từ quy tắc WAF không thể giải quyết được - thay vào đó hãy thay đổi mẫu yêu cầu hoặc IP của bạn.

bài viết liên quan

Os comentários estão desativados para este artigo.