Explainers

Cloudflare Saldırı Modu (IUAM) otomasyonda nasıl çözülür

Otomasyonunuz aniden her sayfada HTTP 503 ve "Checking your browser..." mesajı almaya başladıysa, hedef site "Saldırı Modu"nu (I'm Under Attack Mode — IUAM) açmış demektir. Bu, Cloudflare'in en agresif koruma modudur: her ziyaretçiyi, siteye erişmeden önce yaklaşık 5 saniyelik zorunlu bir JavaScript doğrulamasından geçirir. Düz bir requests veya curl isteği bu doğrulamayı yürütemez. Aşağıda IUAM'ı nasıl tanıyacağınızı, diğer korumalardan nasıl ayıracağınızı ve CaptchaAI ile nasıl çözeceğinizi göreceksiniz.

IUAM tam olarak ne yapar?

Bir site operatörü Cloudflare panelinde "I'm Under Attack Mode" seçeneğini etkinleştirdiğinde akış şöyle işler:

Every request → Cloudflare edge
    ↓
JavaScript challenge page served (HTTP 503)
    ↓
Browser executes JavaScript challenge (~5 seconds)
    ↓
Challenge answer submitted automatically
    ↓
qa_session_cookie cookie set
    ↓
Original page loaded with qa_session_cookie cookie

Doğrulama sayfasının içinde ne var?

Doğrulama sayfası HTTP 503 döndürür ve şu alanları içerir:

  • jschl_vc — doğrulama kodu (challenge verification code)
  • pass — zamanlama token'ı; 5 saniyelik beklemeyi zorunlu kılar
  • jschl_answer — JavaScript tarafından hesaplanan yanıt
  • cf_chl_opt — doğrulama seçenekleri
  • ray — isteğe ait Cloudflare Ray ID
  • Görünür "tarayıcınız kontrol ediliyor" mesajı — kullanıcıya gösterilen bilgilendirme

Ayırt edici özellikler

IUAM'ı dört sinyal ayırt eder: durum kodu 403 değil HTTP 503'tür; doğrulama öncesinde 5 saniyelik zorunlu bekleme vardır; sayfa JavaScript yürütmesi gerektirir, bu yüzden düz HTTP istemcileri başarısız olur; ve doğrulama alan geneli çalışır. Çözümden sonra dönen qa_session_cookie çerezi yaklaşık 30 dakika geçerlidir.

IUAM'ı diğer Cloudflare korumalarından ayırma

Her 503 IUAM değildir; Yönetilen Doğrulama (Managed Challenge), Turnstile ve WAF blokları farklı imzalar bırakır. Yanlış çözücüyü çağırmamak için, isteği göndermeden önce hangisiyle karşı karşıya olduğunuzu belirleyin:

import requests

def identify_cloudflare_protection(url):
    """Distinguish IUAM from other Cloudflare protections."""
    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, allow_redirects=False)
    html = response.text
    status = response.status_code

    if status == 503 and "jschl" in html:
        return "IUAM (I'm Under Attack Mode)"

    if status == 503 and "challenge-platform" in html:
        return "Managed Challenge"

    if status == 403 and "cf-ray" in str(response.headers):
        return "Blocked by WAF/Bot Management"

    if "cf-turnstile" in html:
        return "Turnstile widget"

    if "challenges.cloudflare.com" in html:
        return "Cloudflare doğrulama akışı (generic)"

    if status == 200:
        return "No challenge (passed)"

    return f"Unknown (status: {status})"

Ayırt etme tablosu

Sinyal IUAM Yönetilen Doğrulama Turnstile WAF Bloğu
HTTP durumu 503 503 200 403
Gövdede jschl
5 saniye bekleme Bazen
qa_session_cookie ayarlanır Çözümden sonra Çözümden sonra
Doğrulama sayfası Tam sayfa Tam sayfa Yalnızca widget Hata sayfası
JS gerektirir

JavaScript doğrulaması arka planda nasıl çalışır?

IUAM'ın JavaScript testi, ziyaretçinin gerçek bir tarayıcı çalıştırdığını doğrular. Cloudflare karmaşık (obfuscated) JavaScript içeren doğrulama sayfasını sunar; bu kod sayfadaki dizeler üzerinde matematiksel işlemler yapar, DOM ölçümleri alır ve en az 4-5 saniyelik zamanlamayı zorunlu tutar. Hesaplanan sayısal sonuç jschl_vc, pass ve jschl_answer ile forma konup Cloudflare'e otomatik gönderilir. Cloudflare yanıtı ve zamanlamayı doğrulayınca yaklaşık 30 dakika erişim veren qa_session_cookie çerezini döndürür.

Düz HTTP istemcileri neden başarısız olur?

# This will ALWAYS get the challenge page:
import requests
response = requests.get("https://iuam-protected-site.com")
# response.status_code == 503
# response.text contains "Checking your browser..."

# Plain HTTP clients cannot:
# - Execute JavaScript
# - Compute the challenge answer
# - Meet the timing requirement
# - Generate the required cookies

Bir JavaScript motoru olmadan doğru cevabı üretmek, zamanlamayı tutturmak ve çereze ulaşmak mümkün değildir; bu yüzden ya doğrulamayı bir API çözücüsüne devredersiniz ya da gerçek bir tarayıcı çalıştırırsınız.

IUAM'ı CaptchaAI ile çözme

İstanbul'daki bir e-ticaret ekibinin staging.example.com/qa ortamını gece boyunca izleyen bir QA işi çalıştırdığını düşünün; trafik yükselince Saldırı Modu açılır ve ertesi sabah tüm QA çağrıları 503'e düşer. Doğru yaklaşım, doğrulamayı cloudflare_challenge yöntemiyle çözüp dönen çerezle isteklere devam etmektir.

Yöntem 1: cloudflare_challenge çözücüsü (önerilir)

CaptchaAI'nin cloudflare_challenge yöntemi IUAM doğrulamalarını doğrudan ele alır:

import requests
import time

API_KEY = "YOUR_API_KEY"
TARGET_URL = "https://iuam-protected-site.com/data"

# Step 1: Submit challenge to CaptchaAI
submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "cloudflare_challenge",
    "sitekey": "managed",
    "pageurl": TARGET_URL,
    "json": 1,
})

task_id = submit.json()["request"]
print(f"Task submitted: {task_id}")

# Step 2: Poll for result
for attempt 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:
        token = result["request"]
        print(f"Challenge solved! Token: {token[:50]}...")
        break
    elif result.get("request") == "ERROR_CAPTCHA_UNSOLVABLE":
        print("Challenge could not be solved")
        break
else:
    print("Timed out waiting for solution")

# Step 3: Use qa_session_cookie cookie or token
# The response contains the clearance data needed to access the site

Yanıt, siteye erişmek için gereken izin verilerini içerir: doğrulama sonrası isteklerinizi bu veriyle yaparsınız.

Yöntem 2: CaptchaAI ile tarayıcı otomasyonu

Kalıcı oturumlar için headless tarayıcıyı CaptchaAI ile birleştirin; çözüm sonrası çerezi doğrudan tarayıcıdan alıp requests oturumuna taşırsınız:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import time

API_KEY = "YOUR_API_KEY"

# Launch browser
options = webdriver.ChromeOptions()
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=options)

# Navigate to IUAM page
driver.get("https://iuam-protected-site.com")

# Wait for challenge page to load
time.sleep(3)

# Check if IUAM challenge is present
if "Checking your browser" in driver.page_source or driver.title == "Just a moment...":
    print("IUAM challenge detected")

    # Option A: Wait for browser to solve natively (if not headless)
    try:
        WebDriverWait(driver, 15).until(
            lambda d: "Checking your browser" not in d.page_source
        )
        print("Challenge passed natively")
    except:
        print("Native solve failed — using CaptchaAI")
        # Submit to CaptchaAI for solving
        # Token submission via JavaScript injection

# After challenge is passed, extract cookies for API use
cookies = driver.get_cookies()
qa_session_cookie = next(
    (c["value"] for c in cookies if c["name"] == "qa_session_cookie"), None
)

if qa_session_cookie:
    print(f"qa_session_cookie obtained: {qa_session_cookie[:30]}...")

    # Use cookie with requests library
    session = requests.Session()
    for cookie in cookies:
        session.cookies.set(cookie["name"], cookie["value"])
    session.headers.update({
        "User-Agent": driver.execute_script("return navigator.userAgent"),
    })

    # Now make requests with the clearance cookie
    response = session.get("https://iuam-protected-site.com/api/data")
    print(f"Status: {response.status_code}")

driver.quit()

Node.js ile aynı akış

Node.js tarafında axios ile gönder-ve-sorgula akışı birebir aynıdır:

const axios = require("axios");

const API_KEY = "YOUR_API_KEY";
const TARGET_URL = "https://iuam-protected-site.com/data";

async function solveIUAM() {
  // Submit challenge
  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: {
      key: API_KEY,
      method: "cloudflare_challenge",
      sitekey: "managed",
      pageurl: TARGET_URL,
      json: 1,
    },
  });

  const taskId = submit.data.request;
  console.log(`Task submitted: ${taskId}`);

  // Poll for result
  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) {
      console.log("IUAM challenge solved!");
      return result.data.request;
    }
  }

  throw new Error("Timed out");
}

solveIUAM().then((token) => console.log("Token:", token.substring(0, 50)));

CaptchaAI thread tabanlı faturalanır ve fiyatlar USD üzerindendir; TL kuru dalgalansa da aylık maliyetiniz sabit kalır. Eşzamanlı oturum sayınız thread ihtiyacınızı belirler: küçük QA işleri için BASIC ($15/ay, 5 thread) yeterli, daha yüksek hacim için ADVANCE ($90/ay, 50 thread) gibi planlara geçersiniz.

qa_session_cookie çerezi, bir IUAM doğrulamasını çözmenin asıl çıktısıdır. Alan geneli geçerlidir; süresi varsayılan olarak yaklaşık 30 dakikadır (site tarafından yapılandırılabilir) ve bu süre boyunca yeniden kullanılabilir. Ancak çerez, çözümü yapan IP adresine ve User-Agent'a bağlıdır; ikisinden biri değişirse geçersiz olur.

Çerez yönetimi stratejisi

Süresi dolmadan izni tazeleyen küçük bir yönetici sınıf, tek tek çözümlerden daha dayanıklıdır:

import requests
import time

class IUAMSessionManager:
    """Manage qa_session_cookie cookies for IUAM-protected sites."""

    def __init__(self, api_key, target_url, user_agent=None):
        self.api_key = api_key
        self.target_url = target_url
        self.user_agent = user_agent or (
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/120.0.0.0"
        )
        self.session = requests.Session()
        self.session.headers["User-Agent"] = self.user_agent
        self.clearance_time = 0
        self.clearance_lifetime = 1800  # 30 minutes default

    def needs_refresh(self):
        """Check if clearance cookie needs refreshing."""
        return time.time() - self.clearance_time > self.clearance_lifetime - 60

    def solve_challenge(self):
        """Solve IUAM challenge and update session cookies."""
        submit = requests.post("https://ocr.captchaai.com/in.php", data={
            "key": self.api_key,
            "method": "cloudflare_challenge",
            "sitekey": "managed",
            "pageurl": self.target_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": self.api_key,
                "action": "get",
                "id": task_id,
                "json": 1,
            }).json()

            if result.get("status") == 1:
                # Apply clearance to session
                self.clearance_time = time.time()
                return result["request"]

        raise TimeoutError("IUAM solve timed out")

    def get(self, url, **kwargs):
        """Make a GET request, solving IUAM if needed."""
        if self.needs_refresh():
            self.solve_challenge()
        return self.session.get(url, **kwargs)

Sık karşılaşılan sorunlar ve çözümleri

Belirti Neden Çözüm
Doğrulama sonsuz döngüye giriyor İzin alındıktan sonra IP değişti Çözüm ve erişimde aynı IP'yi kullanın
qa_session_cookie reddediliyor User-Agent uyuşmuyor Çözüm ve isteklerde aynı User-Agent'ı kullanın
Çözümden sonra 503 devam ediyor Çerez süresi doldu (>30 dakika) Süre dolmadan izni yenileyin
Doğrulama sayfası beklenenden farklı Site IUAM değil Yönetilen Doğrulama kullanıyor Turnstile çözme yöntemine geçin
Arka arkaya birden fazla doğrulama sayfası İlki IUAM, ikincisi Turnstile İkisini de sırayla çözün

KVKK notu: bir QA veya veri toplama akışında kişisel veri topluyorsanız bu veriler KVKK kapsamındadır. IUAM'ı çözmek yalnızca teknik erişimi sağlar; veriyi yetkili bir amaç ve saklama politikası içinde tutmak sizin sorumluluğunuzdadır.

Sık sorulan sorular

Neden requests veya curl ile IUAM doğrulamasını çözemiyorum?

Çünkü IUAM gerçek bir JavaScript motoru ister. Düz HTTP istemcileri doğrulama kodunu hesaplayamaz, 5 saniyelik zamanlamayı tutturamaz ve qa_session_cookie çerezini üretemez. Doğrulamayı cloudflare_challenge yöntemine devredin ya da gerçek bir tarayıcı çalıştırın.

IUAM ile Yönetilen Doğrulama'yı nasıl ayırt ederim?

IUAM her ziyaretçiyi koşulsuz doğrular ve gövdesinde jschl bulunan bir 503 döndürür. Yönetilen Doğrulama ise Cloudflare'in bot değerlendirmesiyle yalnızca şüpheli trafiği hedefler ve 503'ü çoğu zaman bir Turnstile widget'ıyla döndürür. Yukarıdaki identify_cloudflare_protection fonksiyonu bu ayrımı yapar.

Hayır. Çerez, çözümü yapan IP adresine ve User-Agent'a bağlıdır. İkisinden birini değiştirdiğinizde çerez geçersiz olur; bu yüzden çözüm ve sonraki istekleri aynı çıkış noktasından yapın.

CaptchaAI hangi Cloudflare doğrulama türlerini çözer, hangilerini çözmez?

CaptchaAI'nin desteği türlere göre nettir:

  • Cloudflare doğrulama akışı (IUAM ve genel challenge) ve Turnstile: cloudflare_challenge yöntemiyle çözülür.
  • hCaptcha ve FunCaptcha: desteklenmez.
  • GeeTest v4: yalnızca "çok yakında".
  • CaptchaFox, Friendly Captcha ve Lemin: beta aşamasında.

Bir çözümden sonra kaç thread'e ihtiyacım olur?

Bu, aynı anda kaç oturumu canlı tutmanız gerektiğine bağlıdır. Tek bir izlenen site için BASIC ($15/ay, 5 thread) genellikle yeterlidir; birden çok siteyi paralel izliyorsanız üst planlara geçin. Fiyatlar USD üzerinden ve thread başına faturalanır, çözüm başına değil.

Özet

Cloudflare Saldırı Modu (IUAM), tüm ziyaretçileri zorunlu bir JavaScript doğrulamasından geçirir ve 5 saniyelik hesaplama gereksinimiyle HTTP 503 döndürür. Önce IUAM'ı diğer korumalardan ayırın, ardından CaptchaAI'nin Cloudflare doğrulama akışı çözücüsüyle çözün ve dönen qa_session_cookie çerezini 30 dakikalık pencerede kullanın. Çözüm ile kullanım arasında IP ve User-Agent'ı hep eşleştirin.

İlgili Makaleler

Bu makale için yorumlar devre dışı bırakılmıştır.