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_cookieterbit setelah lolos, berlaku ~30 menit, satu domain penuh
Alur Singkat: Dari Request ke Cookie
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 GCPasia-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)));
Mengelola Cookie qa_validation_cookie dan Kendala Umum
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
jschlmuncul 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.
Berapa lama cookie qa_validation_cookie bertahan sebelum solve ulang diperlukan?
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.