Cloudflare cung cấp hai hành động thử thách mà người vận hành trang web có thể định cấu hình trong quy tắc WAF: Thử thách được quản lý và Thử thách tương tác. Thử thách được quản lý là cách tiếp cận hiện đại, thích ứng — Cloudflare quyết định độ khó của mỗi khách truy cập. Thử thách tương tác là tùy chọn cũ, luôn hiển thị CAPTCHA hiển thị. Hiểu được sự khác biệt sẽ xác định phương pháp CaptchaAI nào sẽ sử dụng và những gì sẽ xảy ra trong quá trình tự động hóa.
So sánh nhanh
| tính năng | Thử thách được quản lý | Thử thách tương tác |
|---|---|---|
| Giới thiệu | 2021 | Kế thừa (trước năm 2021) |
| Thích ứng? | Có (Cloudflare quyết định cho mỗi khách truy cập) | Không (luôn tương tác) |
| Có thể vượt qua vô hình? | Có (~90% khách truy cập đi qua một cách vô hình) | Không (luôn hiển thị CAPTCHA) |
| Các loại thử thách được sử dụng | Thử thách → cửa quay vô hình → JS | CAPTCHA luôn hiển thị |
| Được đề xuất bởi Cloudflare? | Có (mặc định cho quy tắc mới) | Không (được duy trì để tương thích ngược) |
| Rào cản của người dùng | Thấp (hầu hết vượt qua mà không nhìn thấy gì) | Cao (luôn yêu cầu tương tác) |
| Trạng thái HTTP | 503 | 403 |
| Phương pháp CaptchaAI | turnstile hoặc cloudflare_challenge |
turnstile |
Thử thách được quản lý (hiện đại)
Thử thách được quản lý là hành động thử thách được Cloudflare đề xuất. Nó sử dụng một khung quyết định để đưa ra thách thức ít gây gián đoạn nhất có thể:
Luồng quyết định
WAF rule triggers Managed Challenge
↓
Cloudflare evaluates visitor signals:
├─ Browser fingerprint quality
├─ IP reputation score
├─ TLS fingerprint (JA3/JA4)
├─ Request history
├─ Behavioral signals
└─ Device capabilities
↓
Risk assessment → Challenge level selected:
├─ LOW risk → Invisible pass (no visible UI)
├─ MEDIUM risk → Non-interactive Turnstile (background PoW)
├─ HIGH risk → Interactive Turnstile (checkbox/widget)
└─ VERY HIGH risk → JavaScript challenge page (5s wait)
↓
Challenge completed
↓
<staging-session-cookie> cookie issued
Du khách trải nghiệm gì
| Loại khách | Những gì họ nhìn thấy | Tỷ lệ phần trăm |
|---|---|---|
| Trình duyệt thông thường, IP tốt | Không có gì (vượt qua vô hình) | ~90% |
| Trình duyệt mới, IP trung lập | Máy quay ngắn | ~5% |
| Tín hiệu đáng ngờ | Hộp kiểm cửa quay | ~4% |
| Tín hiệu rủi ro cao | Trang "Đang kiểm tra trình duyệt của bạn..." | ~1% |
đầu ra HTML
Các trang Thử thách được quản lý sử dụng nền tảng thử thách của 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>
Thử thách tương tác (cũ)
Thử thách tương tác luôn hiển thị CAPTCHA hiển thị mà khách truy cập phải tương tác. Không có đường chuyền vô hình - mọi du khách đều nhìn thấy và phải hoàn thành thử thách.
Nó hoạt động như thế nào
WAF rule triggers Interactive Challenge
↓
Full-page CAPTCHA served (HTTP 403)
↓
Visitor must interact with CAPTCHA widget
↓
CAPTCHA solved
↓
<staging-session-cookie> cookie issued
Du khách trải nghiệm gì
Mọi khách truy cập đều thấy một thử thách toàn trang với tiện ích giống như 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>
Tại sao Cloudflare không khuyến khích nó
| vấn đề | tác động |
|---|---|
| Luôn luôn hiển thị | 100% du khách xem thử thách |
| Ma sát cao hơn | Mỗi du khách phải tương tác |
| Tỷ lệ thoát cao hơn | Người dùng rời đi thay vì hoàn thành |
| Không thích ứng với rủi ro | Những du khách nổi tiếng cũng bị thử thách |
| Những lo ngại về khả năng tiếp cận | Mỗi khách truy cập phải hoàn thành tương tác |
Phát hiện: Tôi đang đối mặt với thách thức nào?
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']}")
Bảng phát hiện
| tín hiệu | Thử thách được quản lý | Thử thách tương tác | IUAM | Khối WAF |
|---|---|---|---|---|
| Trạng thái HTTP | 503 | 403 | 503 | 403 |
challenge-platform trong HTML |
✅ | ✅ | ❌ | ❌ |
Đường dẫn managed trong tập lệnh |
✅ | ❌ | ❌ | ❌ |
jschl trong HTML |
❌ | ❌ | ✅ | ❌ |
| Luôn hiển thị tiện ích | ❌ | ✅ | ❌ | ❌ |
| Có thể vượt qua vô hình | ✅ | ❌ | ❌ | ❌ |
Giải quyết từng loại thử thách
Giải quyết thách thức được quản lý
Thử thách được quản lý thường hiển thị dưới dạng tiện ích Cloudflare Turnstile. Sử dụng phương pháp turnstile của 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")
Giải quyết thách thức tương tác
Thử thách tương tác luôn hiển thị một tiện ích hiển thị. Sử dụng cùng một phương pháp turnstile:
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 (cả hai loại)
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;
}
}
Di chuyển từ tương tác sang được quản lý
Cloudflare khuyên bạn nên chuyển từ Thử thách tương tác sang Thử thách được quản lý. Nếu một trang web bạn đang tự động chuyển đổi:
| Thay đổi | Hiệu ứng tự động hóa |
|---|---|
| → tương tác được quản lý | Có thể bắt đầu trôi qua một cách vô hình (~90% cơ hội) |
| HTTP 403 → 503 | Cập nhật kiểm tra mã trạng thái |
| Luôn hiển thị thích ứng → | Tiện ích có thể không có trong HTML |
| Cùng một khóa trang web | Mã giải CaptchaAI vẫn giữ nguyên |
| Đầu ra |
Việc xử lý cookie vẫn giữ nguyên |
Quy trình phát hiện nhanh
- Kiểm tra xem trang có hiển thị trang thử thách xen kẽ hay nhúng tiện ích bên trong luồng ứng dụng hay không.
- Tìm kiếm các điểm đánh dấu cf-chl, vùng chứa Turnstile và móc gọi lại trước khi quyết định đường dẫn xử lý.
- Ghi lại kết quả phát hiện bằng URL trang và nhận dạng proxy để các thay đổi mục tiêu định kỳ được hiển thị nhanh chóng.
Khắc phục sự cố
| Triệu chứng | nguyên nhân | sửa chữa |
|---|---|---|
| 503 không có tiện ích hiển thị | Thử thách được quản lý đã được vượt qua một cách vô hình | Không cần thực hiện hành động nào - bạn đã vượt qua |
| 503 với "Đang kiểm tra trình duyệt của bạn" | Được quản lý nâng lên thành thách thức JS | Sử dụng phương pháp cloudflare_challenge |
| 403 với CAPTCHA hiển thị | Thử thách tương tác (cũ) | Sử dụng phương pháp turnstile |
| 403 không có thử thách | Khối WAF, không phải là một thách thức | Thay đổi IP hoặc mẫu yêu cầu |
| Loại thử thách thay đổi ngẫu nhiên | Thử thách được quản lý thích ứng với tín hiệu | Xử lý cả thử thách Turnstile và JS |
| Các luồng thử thách khác nhau, cùng một miền | Giải quyết bất kỳ thử thách nào được đưa ra |
Câu hỏi thường gặp
Tôi có nên luôn thử Thử thách được quản lý trước không?
Vâng. Hiện nay hầu hết các trang web đều sử dụng Thử thách được quản lý. Bắt đầu với phương pháp turnstile và quay lại cloudflare_challenge nếu trang hiển thị thử thách JavaScript (503 với "Đang kiểm tra trình duyệt của bạn").
Một trang web có thể sử dụng cả hai loại trên các trang khác nhau không?
Có, nhưng nó không phổ biến. Mỗi quy tắc WAF có thể có một hành động khác nhau. Một quy tắc có thể sử dụng Thử thách được quản lý cho /login và Thử thách tương tác cho /api/.
Thử thách được quản lý có còn cần cookie không?
Vâng. Cả hai loại thử thách đều tạo ra cùng một cookie <staging-session-cookie>. Việc xử lý cookie giống hệt nhau bất kể loại thử thách.
Điều gì sẽ xảy ra nếu Managed Challenge vượt qua tôi một cách vô hình?
Nếu Managed Challenge quyết định yêu cầu của bạn có mức độ rủi ro thấp thì nó sẽ chuyển yêu cầu đó mà không có thách thức rõ ràng. Phản hồi của bạn sẽ là 200 bình thường với nội dung trang. Không cần giải CaptchaAI trong trường hợp này.
Thử thách tương tác có bị ngừng sử dụng không?
Cloudflare chưa chính thức ngừng sử dụng tính năng này nhưng họ đề xuất Thử thách được quản lý cho tất cả các quy tắc mới. Thử thách tương tác vẫn đảm bảo khả năng tương thích ngược. Các trang web có thể di chuyển bất cứ lúc nào.
Tóm tắt
Thử thách được quản lý của Cloudflare chọn một cách thích ứng độ khó thử thách cho mỗi khách truy cập (ẩn đối với thử thách JS đầy đủ), trong khi Thử thách tương tác luôn đưa ra CAPTCHA hiển thị. Cả hai đều tạo ra cùng một cookie <staging-session-cookie> và được giải quyết bằngCaptchaAI— sử dụng turnstile cho hầu hết các thử thách và cloudflare_challenge cho các trang thử thách JavaScript. Thử thách được quản lý là mặc định hiện đại; Thử thách tương tác là di sản.