Explainers

Cloudflare WAF-Regeln, die CAPTCHA-Herausforderungen auslösen

Mit der Web Application Firewall (WAF) von Cloudflare können Website-Betreiber Regeln erstellen, die CAPTCHA-Herausforderungen basierend auf bestimmten Anforderungsattributen auslösen – IP-Adresse, Land, URL-Pfad, Bot-Score, Header oder eine beliebige Kombination. Wenn Sie verstehen, welche Regeln Herausforderungen auslösen, können Sie besser diagnostizieren, warum Sie ein CAPTCHA sehen, und den richtigen Ansatz für den Umgang damit wählen.


WAF-Regelaktionen, die CAPTCHAs erzeugen

Cloudflare WAF-Regeln unterstützen mehrere Aktionen. Drei davon stellen lösbare Herausforderungen dar:

WAF-Aktion Was passiert HTTP-Status CaptchaAI-Methode
Managed Challenge Cloudflare entscheidet: unsichtbar, Turnstile oder JS-Herausforderung 503 turnstile
JS-Herausforderung 5-Sekunden-JavaScript-Challenge-Seite 503 cloudflare_challenge
Interaktive Herausforderung Traditionelles CAPTCHA (alt, veraltet) 403 turnstile
Blockieren Harter 403, keine Herausforderung 403 N/A (nicht lösbar)
Erlauben Durchgehen, kein Scheck 200 N/A
Überspringen Überspringen Sie die verbleibenden WAF-Regeln 200 N/A
Protokoll Protokollereignis, keine Aktion 200 N/A

Managed Challenge (am häufigsten)

Managed Challenge ist die von Cloudflare empfohlene Aktion. Es entscheidet adaptiv über die Art der Herausforderung pro Besucher:

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 → cf_clearance cookie issued

Gängige WAF-Regelmuster

Site-Betreiber erstellen WAF-Regeln mithilfe der Ausdruckssprache von Cloudflare. Dies sind die Muster, die am wahrscheinlichsten CAPTCHAs für automatisierten Datenverkehr auslösen:

Bot-Score-Regeln

# 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

Bot-Score-Regeln sind der häufigste Auslöser für Automatisierungstools. Die API-Solver von CaptchaAI erhalten Bewertungen auf menschlicher Ebene, da sie echte Browser verwenden.

Länderspezifische Regeln

# 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

Pfadbasierte Regeln

# 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

Tarifbasierte Regeln

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

Headerbasierte Regeln

# 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

Zusammengesetzte Regeln

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

Identifizieren, welche Regel ausgelöst wurde

Wenn eine CAPTCHA-Aufforderung erscheint, können Sie die auslösende Regel anhand der Antwort identifizieren:

Aus HTTP-Headern

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

Von der Cloudflare Ray ID

Jede Cloudflare-Antwort enthält einen cf-ray-Header. Site-Betreiber können diese Ray-ID im Cloudflare-Dashboard (Sicherheit > Ereignisse) verwenden, um genau zu sehen, welche Regel ausgelöst wurde und welche Maßnahmen ergriffen wurden.


Durch WAF ausgelöste Herausforderungen lösen

Strategie basierend auf der Art der Herausforderung

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;
}

WAF-Regeländerungen und ihre Auswirkungen

Seitenbetreiber passen WAF-Regeln häufig an. Diese Änderungen wirken sich auf die Automatisierung aus:

Veränderung Auswirkung auf die Automatisierung So erkennen Sie
Regel hinzugefügt Auf bewährten Wegen taucht eine neue Herausforderung auf Überwachen Sie 503/403-Statusänderungen
Regel entfernt Die Herausforderung verschwindet 200, wo vorher 503 war
Aktion eskaliert (verwalteter →-Block) Eine lösbare Herausforderung wird zu einem harten Block 403 statt 503
Aktion gelockert (Block → verwaltet) Ein harter Block wird zu einer lösbaren Herausforderung 503 mit Challenge-Seite
Schwellenwert geändert (Bot-Score 30 → 50) Weitere Anfragen wurden angefochten Erhöhte Herausforderungshäufigkeit
Pfadumfang geändert Verschiedene URLs betroffen Neue Wege bringen Herausforderungen mit sich

Überwachungsstrategie

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)

Fehlerbehebung

Symptom Wahrscheinlich WAF-Regel Beheben
Herausforderung nur auf /login Pfadbasierte Regel Lösen Sie die Herausforderung für diesen Weg
Herausforderung nur durch Rechenzentrums-IPs Bot-Score oder IP-Reputationsregel Verwenden Sie Wohn-Proxys oder lösen Sie eine Herausforderung
Die Herausforderung variiert je nach Land Länderspezifische Regel Proxy im zulässigen Land verwenden oder lösen
Herausforderung nach N Anfragen Tarifbasierte Regel Reduzieren Sie die Anfragerate oder lösen Sie jede Herausforderung
Herausforderung immer JS (niemals Turnstile) JS Challenge-Aktion (nicht verwaltet) Verwenden Sie die Methode cloudflare_challenge
403 ohne Herausforderung Aktion blockieren (nicht lösbar) Ändern Sie IP, Header oder Anforderungsmuster

Häufig gestellte Fragen

Kann ich sehen, welche WAF-Regeln eine Site verwendet?

Nein. WAF-Regeln sind privat für den Website-Betreiber. Sie können Regeln nur aus dem Verhalten ableiten – welche Pfade Herausforderungen auslösen, von welchen IPs und welcher Herausforderungstyp auftritt.

Gelten die WAF-Regeln für alle Cloudflare-Pläne?

Benutzerdefinierte WAF-Regeln sind für alle kostenpflichtigen Pläne (Pro, Business, Enterprise) verfügbar. Für kostenlose Pläne gelten begrenzte WAF-Regeln. Managed Challenge ist jedoch für alle Pläne verfügbar, auch für Free.

Können WAF-Regeln unterschiedliche Herausforderungen für unterschiedliche Pfade auslösen?

Ja. Jede WAF-Regel kann eine andere Aktion haben und unterschiedliche Pfade abgleichen. Eine Site könnte Managed Challenge für /login- und JS Challenge für /api/-Endpunkte verwenden.

Wie oft ändern Websites ihre WAF-Regeln?

Es variiert. E-Commerce-Websites passen die Regeln häufig während Verkaufsveranstaltungen an. Auf sicherheitsbewussten Websites können die Regeln wöchentlich aktualisiert werden. Die meisten Websites ändern die Regeln nach der Ersteinrichtung selten.

Hat die Lösung einer WAF-Herausforderung Auswirkungen auf zukünftige Anfragen?

Ja. Nach der Lösung lässt das cf_clearance-Cookie nachfolgende Anfragen ca. 30 Minuten lang ohne Herausforderung durch. Das Cookie ist an Ihre IP und Ihren User-Agent gebunden.


Zusammenfassung

Cloudflare WAF-Regeln lösen CAPTCHA-Herausforderungen basierend auf konfigurierbaren Bedingungen aus: Bot-Score, Land, Pfad, Header oder Rate. Die häufigste Aktion ist die verwaltete Herausforderung, die Cloudflare adaptiv als unsichtbare, Turnstile- oder JS-Herausforderung darstellt. Lösen Sie diese mit CaptchaAI – verwenden Sie die Methode turnstile oder cloudflare_challenge, je nachdem, was gerendert wird. Harte Blöcke (403) aus WAF-Regeln sind nicht lösbar – ändern Sie stattdessen Ihr Anfragemuster oder Ihre IP.

Verwandte Artikel

  • Cloudflare Challenge: Wie es funktioniert
  • Cloudflare Browser Integrity Check vs. CAPTCHA-Challenge
  • Cloudflare Under Attack Mode behandeln
Kommentare sind für diesen Artikel deaktiviert.

Verwandte Beiträge

Explainers Umgang mit Cloudflare im Angriffsmodus
Cloudflare Under Attack Mode (IUAM) bewältigen: Wie die Java Script-Challenge funktioniert und wie man mit Captcha AI den cf_clearance-Cookie generiert.

Cloudflare Under Attack Mode (IUAM) bewältigen: Wie die Java Script-Challenge funktioniert und wie man mit Cap...

Apr 18, 2026