Explainers

Cara Menangani Cloudflare Under Attack Mode

Situs biasanya lancar, lalu tiba-tiba setiap request dibalas HTTP 503 dengan pesan "Checking your browser before accessing..."? Itu Cloudflare Under Attack Mode (IUAM) — bukan pemblokiran permanen, tapi tantangan JavaScript wajib ~5 detik untuk setiap pengunjung, termasuk script scraping Anda. Klien HTTP biasa seperti requests atau curl tidak pernah bisa menembusnya sendirian.


Ciri-Ciri IUAM yang Wajib Dikenali

Empat tanda ini memastikan proteksi yang dihadapi memang IUAM, bukan variasi Cloudflare lain:

  • Status HTTP 503, bukan 403 — tantangan sementara, bukan pemblokiran
  • Wajib tunggu 5 detik sebelum jawaban challenge boleh disubmit
  • Butuh eksekusi JavaScript — klien HTTP polos otomatis gagal
  • Cookie qa_validation_cookie terbit setelah lolos, berlaku ~30 menit, satu domain penuh
Every request → Cloudflare edge
    ↓
JavaScript challenge page served (HTTP 503)
    ↓
Browser executes JavaScript challenge (~5 seconds)
    ↓
Challenge answer submitted automatically
    ↓
qa_validation_cookie cookie set
    ↓
Original page loaded with qa_validation_cookie cookie

Elemen di Halaman Challenge 503

Halaman 503 memuat beberapa parameter tersembunyi: jschl_vc (kode verifikasi), pass (token waktu yang menegakkan tunggu 5 detik), jschl_answer (jawaban hasil komputasi JavaScript), cf_chl_opt (opsi challenge), dan ray (Cloudflare Ray ID untuk request tersebut).


Cara Membedakan IUAM dari Proteksi Cloudflare Lain

Status 503 saja tidak cukup untuk memastikan IUAM — Managed Challenge juga bisa mengembalikan 503. Tabel berikut memuat sinyal pembeda yang perlu dicek sebelum menulis logika solve:

Tabel Sinyal Pembeda

Sinyal IUAM Managed Challenge Turnstile WAF Block
Status HTTP 503 503 200 403
jschl di body
Wajib tunggu 5 detik Kadang
Set qa_validation_cookie Setelah solve Setelah solve
Bentuk halaman Full-page Full-page Widget saja Halaman error
Butuh JS

Untuk otomasi, terapkan tabel ini sebagai fungsi deteksi yang membaca status code dan body respons:

Skrip Deteksi Otomatis

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 challenge (generic)"

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

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

Kalau status-nya 503 tapi tidak ada jschl di body, kemungkinan besar itu Managed Challenge, bukan IUAM — penanganan API-nya berbeda, lihat bagian FAQ dan artikel terkait di bawah.


Logika di Balik JavaScript Challenge IUAM

IUAM dirancang untuk memverifikasi pengunjung benar-benar menjalankan browser asli, bukan skrip. Cloudflare mengirim halaman berisi JavaScript terobfuskasi yang menjalankan operasi matematika atas string halaman, pengukuran DOM, dan penegakan timing minimal 4–5 detik. Hasilnya adalah nilai numerik yang disubmit otomatis ke Cloudflare lewat form berisi jschl_vc, pass, dan jschl_answer. Setelah Cloudflare memvalidasi jawaban sekaligus timing-nya, cookie qa_validation_cookie diterbitkan dan akses berlaku ~30 menit.

Kenapa Klien HTTP Biasa Selalu Mentok

# 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

Intinya: requests, curl, atau axios polos tidak punya mesin JavaScript, jadi tidak bisa menjalankan komputasi challenge, memenuhi syarat timing, atau menghasilkan cookie yang diminta — selamanya terjebak di halaman 503 ini.


Solve Tantangan IUAM Lewat API CaptchaAI

Metode 1: Cloudflare Challenge Solver (paling direkomendasikan)

Metode cloudflare_challenge milik CaptchaAI menangani IUAM langsung, tanpa perlu menjalankan browser di sisi Anda:

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_validation_cookie cookie or token
# The response contains the clearance data needed to access the site

Skenario lapangan: agensi pemantauan harga e-commerce yang menjalankan job dari VPS di region AWS ap-southeast-1 (Singapura) atau GCP asia-southeast2 (Jakarta) kerap kena IUAM justru saat trafik situs target melonjak, misalnya menjelang flash sale. CaptchaAI menagih per thread aktif, bukan per CAPTCHA, jadi retry akibat IP berubah tidak menggandakan biaya — paket BASIC ($15/bulan, 5 thread) sudah cukup untuk beberapa job paralel skala kecil.

Metode 2: Kombinasi Browser Otomatis dengan CaptchaAI

Untuk sesi yang perlu bertahan lama, gabungkan headless browser dengan CaptchaAI:

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()
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_validation_cookie = next(
    (c["value"] for c in cookies if c["name"] == "qa_validation_cookie"), None
)

if qa_validation_cookie:
    print(f"qa_validation_cookie obtained: {qa_validation_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()

Versi Node.js

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

Cookie qa_validation_cookie adalah hasil utama dari proses solve IUAM. Karena terikat IP, jaga agar IP untuk solve dan untuk request berikutnya tetap sama sepanjang sesi — jangan berganti IP di tengah jalan, apalagi saat prosesnya paralel di banyak worker.

Properti Nilai
Nama cookie qa_validation_cookie
Masa berlaku ~30 menit (bisa dikonfigurasi operator situs)
Cakupan Satu domain penuh
Terikat pada Alamat IP + User-Agent
Bisa dipakai ulang Ya, selama masih berlaku
Bisa dipindah ke sesi lain Hanya jika IP dan User-Agent sama persis

Kendala yang Sering Muncul

  • Challenge berulang tanpa henti — biasanya IP berubah setelah dapat clearance; pakai IP yang sama untuk solve dan akses
  • Cookie ditolak — User-Agent solve dan request tidak cocok; samakan string-nya di kedua proses
  • 503 masih muncul setelah solve — cookie sudah kedaluwarsa (>30 menit); refresh sebelum masa berlakunya habis
  • Halaman challenge beda dari dugaan — situs sebenarnya pakai Managed Challenge; pindah ke metode solver Turnstile
  • Dua halaman challenge berturut-turut — challenge pertama IUAM, kedua Turnstile; solve keduanya berurutan

Kelas Python berikut mengotomatiskan siklus refresh agar kendala di atas tidak perlu ditangani manual:

Otomatisasi Lewat SessionManager

import requests
import time

class IUAMSessionManager:
    """Manage qa_validation_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)

Pertanyaan seputar Cloudflare IUAM

Bagaimana cara mendeteksi IUAM tanpa membuka situs langsung di browser?

Cek dua hal dari response HTTP:

  • Status code 503
  • String jschl muncul di body-nya

Kombinasi keduanya adalah penanda IUAM; 503 saja tidak cukup karena Managed Challenge juga bisa mengembalikan status yang sama.

Apakah IUAM sama seperti CAPTCHA checkbox biasa, misalnya reCAPTCHA?

Tidak. IUAM tidak menampilkan checkbox atau gambar untuk diklik pengguna — verifikasinya berjalan otomatis lewat komputasi JavaScript di background selama ~5 detik. Karena itu IUAM ditangani lewat metode cloudflare_challenge di CaptchaAI, bukan metode userrecaptcha yang dipakai untuk reCAPTCHA v2.

Standarnya 30 menit, tapi operator situs bisa mengonfigurasinya dari 15 menit sampai 24 jam. Jadwalkan refresh sebelum masa berlaku habis; jangan menunggu request pertama gagal baru bereaksi.

Apakah situs kecil bisa mengaktifkan IUAM meski jarang diserang, misalnya menjelang flash sale 12.12?

Bisa. Sejumlah tim developer mengaktifkannya sebagai lapisan keamanan tambahan menjelang event trafik tinggi seperti Harbolnas, meski situsnya bukan target serangan aktual — anggap itu selalu mungkin dan siapkan penanganannya sejak awal.


Ringkasan

Cloudflare Under Attack Mode mewajibkan setiap pengunjung melewati JavaScript challenge, mengembalikan HTTP 503 dengan komputasi wajib 5 detik. Solve challenge-nya lewat Cloudflare Challenge Solver CaptchaAI, lalu pakai cookie qa_validation_cookie untuk request berikutnya dalam jendela 30 menit. Jaga IP dan User-Agent tetap konsisten antara solve dan pakai — dan karena billing CaptchaAI berbasis thread, bukan per solve, retry wajar akibat IUAM tidak membengkakkan biaya Anda.

Artikel Terkait

Komentar dinonaktifkan untuk artikel ini.