Cloudflare menyediakan dua aksi challenge yang dapat dikonfigurasi operator situs dalam aturan WAF: Managed Challenge dan Interactive Challenge. Managed Challenge adalah pendekatan modern dan adaptif — Cloudflare menentukan tingkat kesulitan per pengunjung. Interactive Challenge adalah opsi lama yang selalu menampilkan CAPTCHA terlihat. Memahami perbedaannya menentukan metode CaptchaAI mana yang digunakan dan apa yang diharapkan selama otomasi.
Perbandingan Cepat
| Fitur | Managed Challenge | Interactive Challenge |
|---|---|---|
| Diperkenalkan | 2021 | Legacy (pra-2021) |
| Adaptif? | Ya (Cloudflare memutuskan per pengunjung) | Tidak (selalu interaktif) |
| Invisible pass mungkin? | Ya (~90% pengunjung lolos tanpa tampilan) | Tidak (selalu menampilkan CAPTCHA) |
| Tipe challenge yang digunakan | Invisible JS → Turnstile → JS Challenge | CAPTCHA selalu terlihat |
| Direkomendasikan Cloudflare? | Ya (default untuk aturan baru) | Tidak (dipertahankan untuk backward compatibility) |
| Gesekan pengguna | Rendah (kebanyakan lolos tanpa melihat apapun) | Tinggi (selalu butuh interaksi) |
| Status HTTP | 503 | 403 |
| Metode CaptchaAI | turnstile atau cloudflare_challenge |
turnstile |
Managed Challenge (Modern)
Managed Challenge adalah aksi challenge yang direkomendasikan Cloudflare. Pendekatan ini menggunakan kerangka keputusan untuk menyajikan challenge yang paling tidak mengganggu:
Alur Keputusan
Aturan WAF memicu Managed Challenge
↓
Cloudflare mengevaluasi sinyal pengunjung:
├─ Kualitas browser sinyal browser
├─ Skor reputasi IP
├─ TLS sinyal browser (JA3/JA4)
├─ Riwayat request
├─ Sinyal perilaku
└─ Kapabilitas perangkat
↓
Penilaian risiko → Level challenge dipilih:
├─ RISIKO RENDAH → Invisible pass (tidak ada UI terlihat)
├─ RISIKO SEDANG → Turnstile non-interaktif (background PoW)
├─ RISIKO TINGGI → Interactive Turnstile (checkbox/widget)
└─ RISIKO SANGAT TINGGI → Halaman JavaScript challenge (tunggu 5 detik)
↓
Challenge selesai
↓
Cookie qa_validation_cookie diterbitkan
Yang Dialami Pengunjung
| Tipe pengunjung | Yang mereka lihat | Persentase |
|---|---|---|
| Browser biasa, IP bagus | Tidak ada (invisible pass) | ~90% |
| Browser baru, IP netral | Spinner singkat | ~5% |
| Sinyal mencurigakan | Checkbox Turnstile | ~4% |
| Sinyal berisiko tinggi | Halaman "Checking your browser..." | ~1% |
Output HTML
Halaman Managed Challenge menggunakan platform challenge Cloudflare:
<!-- Managed Challenge page (when visible) -->
<body>
<div id="challenge-stage">
<div id="challenge-body-text">
Verifying you are human. This may take a few seconds.
</div>
<!-- Turnstile widget (when rendered) -->
<div class="cf-turnstile"
data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg">
</div>
</div>
<!-- Challenge platform script -->
<script src="/cdn-cgi/challenge-platform/h/g/orchestrate/managed/v1?ray=...">
</script>
</body>
Interactive Challenge (Legacy)
Interactive Challenge selalu menampilkan CAPTCHA visual yang harus diinteraksikan pengunjung. Tidak ada jalan invisible — setiap pengunjung melihat dan harus menyelesaikan challenge-nya.
Cara Kerjanya
Aturan WAF memicu Interactive Challenge
↓
Full-page CAPTCHA disajikan (HTTP 403)
↓
Pengunjung harus berinteraksi dengan widget CAPTCHA
↓
CAPTCHA diselesaikan
↓
Cookie qa_validation_cookie diterbitkan
Yang Dialami Pengunjung
Setiap pengunjung melihat challenge full-page dengan widget seperti Turnstile:
<!-- Interactive Challenge page -->
<body>
<div id="challenge-running">
<div class="main-wrapper">
<h2>Please verify you are human</h2>
<!-- Always-visible challenge widget -->
<div class="challenge-widget">
<!-- Checkbox + verification -->
</div>
</div>
</div>
</body>
Mengapa Cloudflare Tidak Merekomendasikannya
| Masalah | Dampak |
|---|---|
| Selalu terlihat | 100% pengunjung melihat challenge |
| Gesekan lebih tinggi | Setiap pengunjung harus berinteraksi |
| Bounce rate lebih tinggi | Pengguna pergi daripada menyelesaikannya |
| Tidak ada adaptasi risiko | Pengunjung yang dikenal baik juga kena challenge |
| Masalah aksesibilitas | Setiap pengunjung harus menyelesaikan interaksi |
Deteksi: Challenge Apa yang Saya Hadapi?
import requests
import re
def identify_challenge_type(url):
"""Determine if a URL uses Managed or Interactive Challenge."""
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)
html = response.text
status = response.status_code
result = {
"url": url,
"status": status,
"challenge_type": None,
"cf_ray": response.headers.get("cf-ray", ""),
"solve_method": None,
}
if status == 200:
# Check for inline Turnstile widget (not a challenge page)
if "cf-turnstile" in html:
result["challenge_type"] = "turnstile_widget"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "none"
return result
if status == 503:
# 503 indicates Managed Challenge or IUAM
if "managed" in html or "challenge-platform" in html:
result["challenge_type"] = "managed_challenge"
result["solve_method"] = "turnstile" # Managed renders as Turnstile
elif "jschl" in html:
result["challenge_type"] = "iuam_js_challenge"
result["solve_method"] = "cloudflare_challenge"
else:
result["challenge_type"] = "unknown_503"
return result
if status == 403:
if "challenge" in html.lower():
result["challenge_type"] = "interactive_challenge"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "waf_block"
result["solve_method"] = None # Hard block, not solvable
return result
return result
# Usage
info = identify_challenge_type("https://protected-site.com/login")
print(f"Challenge: {info['challenge_type']}")
print(f"Solve with: {info['solve_method']}")
Tabel Deteksi
| Sinyal | Managed Challenge | Interactive Challenge | IUAM | WAF Block |
|---|---|---|---|---|
| Status HTTP | 503 | 403 | 503 | 403 |
challenge-platform dalam HTML |
✅ | ✅ | ❌ | ❌ |
Path managed dalam skrip |
✅ | ❌ | ❌ | ❌ |
jschl dalam HTML |
❌ | ❌ | ✅ | ❌ |
| Selalu menampilkan widget | ❌ | ✅ | ❌ | ❌ |
| Invisible pass mungkin | ✅ | ❌ | ❌ | ❌ |
Cara Solve Setiap Jenis Challenge
Solve Managed Challenge
Managed Challenge biasanya ditampilkan sebagai widget Turnstile. Gunakan metode turnstile CaptchaAI:
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_managed_challenge(url, sitekey=None):
"""Solve Cloudflare Managed Challenge."""
# If sitekey not provided, extract from page
if not sitekey:
import re
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
}
page = requests.get(url, headers=headers, timeout=15)
match = re.search(
r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', page.text
)
sitekey = match.group(1) if match else None
if not sitekey:
# No visible Turnstile — try cloudflare_challenge method
return solve_js_challenge(url)
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"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("Solve timed out")
def solve_js_challenge(url):
"""Fallback to cloudflare_challenge method."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "cloudflare_challenge",
"sitekey": "managed",
"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("Solve timed out")
Solve Interactive Challenge
Interactive Challenge selalu menampilkan widget yang terlihat. Gunakan metode turnstile yang sama:
def solve_interactive_challenge(url, sitekey):
"""Solve Cloudflare Interactive Challenge (legacy)."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"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("Solve timed out")
Node.js (keduanya tipe)
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solveCloudflareChallenge(url, type = "managed") {
const method = type === "js_challenge" ? "cloudflare_challenge" : "turnstile";
const sitekey =
type === "js_challenge" ? "managed" : await extractSitekey(url);
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: {
key: API_KEY,
method,
sitekey: sitekey || "managed",
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("Solve timed out");
}
async function extractSitekey(url) {
try {
const response = await axios.get(url, {
headers: { "User-Agent": "Mozilla/5.0 Chrome/120.0.0.0" },
validateStatus: () => true,
});
const match = response.data.match(
/data-sitekey=["']([0-9x][A-Za-z0-9_-]+)["']/
);
return match ? match[1] : null;
} catch {
return null;
}
}
Migrasi dari Interactive ke Managed Challenge
Cloudflare merekomendasikan migrasi dari Interactive Challenge ke Managed Challenge. Jika situs yang Anda otomasi beralih:
| Perubahan | Efek pada Otomasi |
|---|---|
| Interactive → Managed | Mungkin mulai lolos invisible (~90% kemungkinan) |
| HTTP 403 → 503 | Perbarui pemeriksaan kode status |
| Selalu terlihat → adaptif | Widget mungkin tidak ada di HTML |
| Sitekey yang sama | Kode solve CaptchaAI tetap sama |
| Output qa_validation_cookie yang sama | Penanganan cookie tetap sama |
Alur kerja detektor cepat
- Periksa apakah halaman tersebut menampilkan halaman tantangan interstisial atau menyematkan widget di dalam alur aplikasi.
- Cari penanda cf-chl, wadah pintu putar, dan kait panggilan balik sebelum memutuskan jalur penanganan.
- Catat hasil deteksi dengan URL halaman dan identitas proksi sehingga perubahan target yang berulang dapat terlihat dengan cepat.
Alur kerja detektor cepat
- Periksa apakah halaman tersebut menampilkan halaman tantangan interstisial atau menyematkan widget di dalam alur aplikasi.
- Cari penanda cf-chl, wadah pintu putar, dan kait panggilan balik sebelum memutuskan jalur penanganan.
- Catat hasil deteksi dengan URL halaman dan identitas proksi sehingga perubahan target yang berulang dapat terlihat dengan cepat.
Pemecahan masalah
| Gejala | Sebab | Perbaiki |
|---|---|---|
| 503 tanpa widget yang terlihat | Tantangan Terkelola berlalu tanpa terlihat | Tidak perlu tindakan apa pun — Anda lulus |
| 503 dengan "Memeriksa browser Anda" | Berhasil diangkat ke tantangan JS | Gunakan metode cloudflare_challenge |
| 403 dengan CAPTCHA terlihat | Tantangan Interaktif (warisan) | Gunakan metode turnstile |
| 403 tanpa tantangan | Blok WAF, bukan tantangan | Ubah IP atau pola permintaan |
| Jenis tantangan berubah secara acak | Tantangan Terkelola beradaptasi dengan sinyal | Tangani tantangan Cloudflare Turnstile dan JS |
| qa_validation_cookie dari satu jenis ditolak untuk jenis lainnya | Aliran tantangan yang berbeda, domain yang sama | Selesaikan tantangan apa pun yang disajikan |
Pertanyaan Umum
Haruskah saya selalu mencoba Managed Challenge terlebih dahulu?
Ya. Sebagian besar situs sekarang menggunakan Managed Challenge. Mulai dengan metode turnstile, dan fallback ke cloudflare_challenge jika halaman menampilkan JavaScript challenge (503 dengan "Checking your browser").
Bisakah situs menggunakan kedua tipe pada halaman berbeda?
Ya, tapi jarang. Setiap aturan WAF bisa punya aksi berbeda. Satu aturan mungkin menggunakan Managed Challenge untuk /login dan Interactive Challenge untuk /api/.
Apakah Managed Challenge masih perlu cookie qa_validation_cookie?
Ya. Kedua tipe challenge menghasilkan cookie qa_validation_cookie yang sama. Penanganan cookie sama, apapun tipe challenge-nya.
Bagaimana jika Managed Challenge tidak disadari?
Jika Managed Challenge memutuskan bahwa request Anda berisiko rendah, request akan diteruskan tanpa challenge yang terlihat. Respons Anda adalah 200 normal dengan konten halaman. Tidak diperlukan solving CaptchaAI dalam kasus ini.
Apakah Interactive Challenge sudah dihentikan?
Cloudflare belum secara resmi menghentikannya, tapi merekomendasikan Managed Challenge untuk semua aturan baru. Interactive Challenge dipertahankan untuk backward compatibility. Situs bisa migrasi kapan saja.
Ringkasan
Cloudflare Managed Challenge secara adaptif memilih tingkat kesulitan challenge per pengunjung (dari invisible pass hingga JS challenge penuh), sedangkan Interactive Challenge selalu menampilkan CAPTCHA terlihat. Keduanya menghasilkan cookie qa_validation_cookie yang sama dan dapat di-solve dengan CaptchaAI — gunakan turnstile untuk sebagian besar challenge dan cloudflare_challenge untuk halaman JavaScript challenge. Managed Challenge adalah standar modern; Interactive Challenge adalah legacy.
Artikel Terkait
- Cloudflare Browser Integrity Check vs CAPTCHA
- Cloudflare Challenge vs Turnstile: Cara Mendeteksi