Thấy dòng chữ "Checking your browser before accessing..." hoặc "Verify you are human" ngay khi vừa mở một trang web? Đó là Cloudflare Challenge — trang xen toàn màn hình mà Cloudflare hiển thị khi nghi ngờ khách truy cập là bot, chặn hẳn nội dung gốc cho tới khi trình duyệt xác minh xong. Đừng nhầm với Cloudflare Turnstile: Turnstile chỉ là tiện ích nhỏ nhúng trong trang, không chặn toàn bộ truy cập.
Xác minh xong, Cloudflare cấp cookie cf_clearance — coi như "vé thông hành" cho các request tiếp theo. Bài này giải thích vì sao Cloudflare bật thử thách, luồng xử lý phía sau, và cách tự động giải nó bằng CaptchaAI khi bạn crawl hoặc kiểm thử một trang được bảo vệ mà mình có quyền truy cập.
Vì sao Cloudflare bật Challenge và cookie cf_clearance hoạt động ra sao
| Yếu tố kích hoạt | Vì sao Cloudflare nghi ngờ |
|---|---|
| IP từ trung tâm dữ liệu | Request đến từ nhà cung cấp hosting/cloud đã biết, không phải ISP dân dụng |
| Header bất thường | Thiếu hoặc sai định dạng header HTTP tiêu chuẩn |
| Fingerprint TLS | Chữ ký JA3/JA4 trùng mẫu bot đã ghi nhận |
| Tần suất request cao | Quá nhiều request từ cùng một IP trong thời gian ngắn |
| Mức bảo mật của site | Chủ site đặt ngưỡng Challenge ở mức cao |
| Quy tắc theo quốc gia | Site chặn hoặc thử thách theo vùng địa lý |
| Bot score thấp | Điểm bot do mô hình ML của Cloudflare tính ra quá thấp |
| Nằm trong danh sách đe dọa | IP xuất hiện trong threat-intelligence của Cloudflare |
Một khi đã bị đánh dấu, đây là toàn bộ đường đi của request tới lúc trình duyệt được cấp cookie:
Request → Cloudflare proxy → Suspicious? → Challenge page
↓
Browser verification
↓
qa_session_cookie cookie set
↓
Original page loads
| Bước | Diễn ra gì |
|---|---|
| 1. Request bị chặn lại | Reverse proxy của Cloudflare đánh giá request vừa gửi tới |
| 2. Chấm điểm rủi ro | Danh tiếng IP, header, fingerprint TLS và hành vi được phân tích cùng lúc |
| 3. Challenge được đưa ra | Nếu đáng ngờ, trang thử thách thay hẳn phản hồi gốc |
| 4. Trình duyệt tự xác minh | Một đoạn JavaScript chạy ngầm để tính fingerprint |
| 5. Cookie được cấp | Xác minh xong, cf_clearance được set với TTL cấu hình được |
| 6. Truy cập được mở | Trình duyệt tải lại và nhận đúng nội dung gốc |
Cookie nhận về có dạng:
qa_session_cookie=abc123...; path=/; domain=.example.com; secure; HttpOnly; SameSite=None
| Thuộc tính | Chi tiết |
|---|---|
| Thời hạn | 15 phút đến 24 giờ, do chủ site cấu hình |
| Phạm vi | Gắn với một domain cụ thể, không dùng chéo sang domain khác |
| Ràng buộc | Gắn với đúng User-Agent và địa chỉ IP đã dùng lúc xác minh |
| Cách dùng | Phải gửi kèm mọi request tiếp theo, thiếu là bị yêu cầu xác minh lại |
Lưu ý: cookie cf_clearance ràng buộc chặt với User-Agent và địa chỉ IP dùng lúc xác minh — đổi một trong hai là cookie mất hiệu lực ngay lập tức.
Cloudflare Challenge, Turnstile và JS Challenge khác nhau ra sao
| Tiêu chí | Cloudflare Challenge | Turnstile | JS Challenge |
|---|---|---|---|
| Hình thức | Trang xen toàn màn hình | Widget nhúng trong trang | Kiểm tra ngầm |
| Người dùng thấy gì | Trang "Checking your browser" | Checkbox hoặc không thấy gì | Không thấy gì |
| Chặn truy cập trang | Có | Không | Trong chốc lát |
| Có set cookie cf_clearance | Có | Đôi khi | Có |
| Cần proxy để giải | Có | Không | Không áp dụng |
| Site phải dùng Cloudflare CDN | Bắt buộc | Không bắt buộc | Bắt buộc |
Giải Cloudflare Challenge bằng CaptchaAI
Việc giải Cloudflare Challenge bắt buộc phải có proxy: cookie cf_clearance bị ràng buộc mật mã với IP, User-Agent và đôi khi cả fingerprint TLS dùng lúc xác minh. Lệch một trong ba yếu tố đó giữa bước giải và request kế tiếp là cookie vô giá trị.
Ví dụ thực tế: một team QA outsource ở TP.HCM kiểm thử một trang thương mại điện tử dùng Cloudflare cho khách hàng nước ngoài. Nếu bước giải chạy từ proxy A nhưng request kiểm thử sau đó lại gọi qua proxy B, cookie cf_clearance CaptchaAI trả về sẽ vô hiệu ngay — job fail không vì lỗi ứng dụng mà vì lệch proxy. Luôn dùng đúng một proxy cho cả bước giải lẫn các request tiếp theo trong cùng session.
Python:
import requests
import time
API_KEY = "YOUR_API_KEY"
# Submit task — proxy is REQUIRED
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "cloudflare_challenge",
"pageurl": "https://example.com/protected-page",
"proxy": "username:[email protected]:8080",
"proxytype": "HTTP",
"json": 1
})
task_id = response.json()["request"]
# Poll for result
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:
solution = result["request"]
# solution contains qa_session_cookie cookie + user_agent
print(f"qa_session_cookie: {solution}")
break
Task gửi tới in.php cùng proxy; for polling res.php mỗi 5 giây tới khi status chuyển 1. Cloudflare Challenge thường giải trong dưới 15 giây, lâu hơn Turnstile (dưới 10 giây) vì phải mô phỏng đầy đủ xác minh trình duyệt.
Node.js:
const axios = require('axios');
async function solveCloudflareChallenge(pageurl, proxy) {
const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: 'YOUR_API_KEY',
method: 'cloudflare_challenge',
pageurl,
proxy,
proxytype: 'HTTP',
json: 1
}
});
const taskId = data.request;
for (let i = 0; i < 60; i++) {
await new Promise(r => setTimeout(r, 5000));
const res = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (res.data.status === 1) return res.data.request;
}
throw new Error('Timeout');
}
Cùng logic gửi/poll như bản Python, viết theo async/await cho stack Node.js.
Dùng lại cookie cf_clearance:
# After getting the solution
qa_session_cookie = solution["qa_session_cookie"]
user_agent = solution["user_agent"]
# Use the SAME proxy and user agent for subsequent requests
session = requests.Session()
session.cookies.set("qa_session_cookie", qa_session_cookie, domain=".example.com")
session.headers["User-Agent"] = user_agent
session.proxies = {"https": "http://username:[email protected]:8080"}
# Now access the protected page
page = session.get("https://example.com/protected-page")
print(f"Status: {page.status_code}")
Gắn cf_clearance, user_agent và đúng proxy đã dùng lúc giải vào một Session duy nhất — thiếu một trong ba, request tiếp theo bị thử thách lại từ đầu.
Trang vừa có Cloudflare Challenge vừa có reCAPTCHA? Giải Challenge trước để vào trang, rồi mới giải reCAPTCHA trên nội dung vừa tải.
Câu hỏi thường gặp
Cloudflare Challenge khác Turnstile ở điểm nào?
Challenge là trang xen toàn màn hình, chặn hẳn nội dung gốc tới khi xác minh xong; Turnstile chỉ là widget nhỏ nhúng trong trang, không nhất thiết chặn truy cập. Challenge đòi hỏi site dùng Cloudflare làm proxy, Turnstile thì gắn được vào bất kỳ trang nào.
Cookie cf_clearance tồn tại bao lâu?
Do chủ site cấu hình, thường từ 15 phút đến 24 giờ. Hết hạn thì trình duyệt phải giải lại thử thách từ đầu.
Giải Cloudflare Challenge qua CaptchaAI có bắt buộc dùng proxy không?
Có. Cookie cf_clearance gắn với địa chỉ IP đã dùng lúc xác minh, nên nếu proxy không khớp với IP bạn dùng sau đó, cookie trả về sẽ vô dụng ngay ở request kế tiếp.
Crawler dùng Requests hoặc Scrapy mặc định có tự vượt qua Cloudflare Challenge được không?
Không. Challenge cần chạy JavaScript thật trong trình duyệt để tính fingerprint, mà thư viện HTTP thuần như Requests hay Scrapy mặc định không thực thi được bước này. Cần trình duyệt headless thật hoặc dịch vụ giải như CaptchaAI trả cookie hợp lệ để dùng lại trong session HTTP thuần.
Giải Cloudflare Challenge qua CaptchaAI tốn bao nhiêu?
Tính theo gói thread, không theo từng lần giải. Gói BASIC ($15/tháng, 5 thread) đủ cho khối lượng thấp; cần giải song song nhiều Challenge thì cân nhắc ADVANCE ($90/tháng, 50 thread) hoặc cao hơn tùy tải thực tế.
Hướng dẫn liên quan
Đọc thêm cách giải Cloudflare Challenge bằng API, các mã lỗi Cloudflare Challenge và cách xử lý, Cloudflare Turnstile hoạt động như thế nào, và cách giải Cloudflare Turnstile bằng API.