Tường lửa ứng dụng web (WAF) của Cloudflare cho phép người vận hành trang web tạo các quy tắc kích hoạt thử thách CAPTCHA dựa trên các thuộc tính yêu cầu cụ thể — địa chỉ IP, quốc gia, đường dẫn URL, điểm bot, tiêu đề hoặc bất kỳ sự kết hợp nào. Việc hiểu những quy tắc nào gây ra thách thức sẽ giúp bạn chẩn đoán lý do tại sao bạn nhìn thấy CAPTCHA và chọn phương pháp phù hợp để xử lý vấn đề đó.
Các hành động quy tắc WAF tạo ra CAPTCHA
Quy tắc WAF của Cloudflare hỗ trợ một số hành động. Ba trong số đó đưa ra những thách thức có thể giải quyết được:
| hành động WAF | Chuyện gì xảy ra | Trạng thái HTTP | Phương pháp CaptchaAI |
|---|---|---|---|
| Thử thách được quản lý | Cloudflare quyết định: thử thách vô hình, Turnstile hoặc JS | 503 | turnstile |
| Thử thách JS | Trang thử thách JavaScript 5 giây | 503 | cloudflare_challenge |
| Thử thách tương tác | CAPTCHA truyền thống (cũ, không được dùng nữa) | 403 | turnstile |
| Chặn | Khó 403, không có thử thách | 403 | N/A (không thể giải quyết được) |
| Cho phép | Đi qua, không kiểm tra | 200 | N/A |
| Bỏ qua | Bỏ qua các quy tắc WAF còn lại | 200 | N/A |
| Nhật ký | Đăng nhập sự kiện, không có hành động | 200 | N/A |
Thử thách được quản lý (phổ biến nhất)
Thử thách được quản lý là hành động được Cloudflare khuyến nghị. Nó quyết định một cách thích ứng loại thử thách cho mỗi khách truy cập:
WAF rule matches → Managed Challenge triggered
↓
Cloudflare evaluates visitor:
├─ Low risk → Invisible pass (no visible challenge)
├─ Medium risk → Turnstile widget (click to verify)
└─ High risk → JavaScript challenge page
↓
Successful → <staging-session-cookie> cookie issued
Các mẫu quy tắc WAF phổ biến
Người vận hành trang web tạo quy tắc WAF bằng ngôn ngữ biểu thức của Cloudflare. Đây là những mẫu có nhiều khả năng kích hoạt CAPTCHA nhất cho lưu lượng truy cập tự động:
Quy tắc tính điểm của Bot
# Challenge traffic with low bot scores
(cf.bot_management.score lt 30)
→ Action: Managed Challenge
# Challenge non-verified bots
(cf.bot_management.score lt 50 and not cf.bot_management.verified_bot)
→ Action: JS Challenge
Quy tắc tính điểm của bot là yếu tố kích hoạt phổ biến nhất cho các công cụ tự động hóa. Trình giải mã API của CaptchaAI nhận được điểm ở cấp độ con người vì họ sử dụng trình duyệt thực.
Quy tắc theo quốc gia
# Challenge traffic from specific countries
(ip.geoip.country in {"CN" "RU" "VN" "IN"})
→ Action: Managed Challenge
# Block specific regions entirely
(ip.geoip.country eq "XX")
→ Action: Block
Quy tắc dựa trên đường dẫn
# Challenge login page access
(http.request.uri.path eq "/login" or http.request.uri.path eq "/signup")
→ Action: Managed Challenge
# Challenge API endpoints
(http.request.uri.path contains "/api/")
→ Action: JS Challenge
Quy tắc dựa trên tỷ lệ
# Challenge after high request rate
(cf.threat_score gt 10 and http.request.uri.path contains "/search")
→ Action: Managed Challenge
Quy tắc dựa trên tiêu đề
# Challenge requests with no Accept-Language header
(not http.request.headers["accept-language"])
→ Action: JS Challenge
# Challenge requests with suspicious UA
(http.user_agent contains "python" or http.user_agent contains "curl")
→ Action: Managed Challenge
Quy tắc ghép
# Multiple conditions
(cf.bot_management.score lt 30
and http.request.uri.path contains "/api/"
and ip.geoip.country ne "US")
→ Action: JS Challenge
Xác định quy tắc nào được kích hoạt
Khi thử thách CAPTCHA xuất hiện, bạn có thể xác định quy tắc kích hoạt từ phản hồi:
Từ tiêu đề HTTP
import requests
def check_cloudflare_rule_info(url):
"""Extract WAF rule information from Cloudflare challenge response."""
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)
info = {
"status": response.status_code,
"cf_ray": response.headers.get("cf-ray", ""),
"cf_cache_status": response.headers.get("cf-cache-status", ""),
"server": response.headers.get("server", ""),
}
# Challenge-specific info
html = response.text
if response.status_code == 503:
if "jschl" in html:
info["challenge_type"] = "JS Challenge (IUAM or WAF rule)"
elif "challenge-platform" in html:
info["challenge_type"] = "Managed Challenge"
elif "cf-turnstile" in html:
info["challenge_type"] = "Turnstile (Managed Challenge)"
elif response.status_code == 403:
if "cf-ray" in str(response.headers):
info["challenge_type"] = "WAF Block (no challenge)"
else:
info["challenge_type"] = "Origin 403 (not Cloudflare)"
return info
Từ ID Cloudflare Ray
Mọi phản hồi của Cloudflare đều bao gồm tiêu đề cf-ray. Người vận hành trang web có thể sử dụng ID Ray này trong bảng điều khiển của Cloudflare (Bảo mật > Sự kiện) để xem chính xác quy tắc nào đã kích hoạt và hành động nào đã được thực hiện.
Giải quyết các thách thức do WAF kích hoạt
Chiến lược dựa trên loại thử thách
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_cloudflare_challenge(url, challenge_type):
"""Solve Cloudflare challenge based on WAF rule action."""
if challenge_type == "managed_challenge":
# Managed Challenge typically renders as Turnstile
method = "turnstile"
sitekey = extract_turnstile_sitekey(url)
elif challenge_type == "js_challenge":
# JavaScript Challenge page
method = "cloudflare_challenge"
sitekey = "managed"
else:
raise ValueError(f"Unknown challenge type: {challenge_type}")
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": method,
"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("Challenge solve timed out")
def extract_turnstile_sitekey(url):
"""Fetch page and extract Turnstile sitekey."""
import re
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)
match = re.search(r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', response.text)
return match.group(1) if match else None
Node.js
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solveWAFChallenge(url, challengeType) {
const method =
challengeType === "js_challenge" ? "cloudflare_challenge" : "turnstile";
const sitekey =
challengeType === "js_challenge" ? "managed" : await extractSitekey(url);
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: {
key: API_KEY,
method,
sitekey,
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("Challenge solve timed out");
}
async function extractSitekey(url) {
const response = await axios.get(url, {
headers: {
"User-Agent": "Mozilla/5.0 Chrome/120.0.0.0",
},
});
const match = response.data.match(/data-sitekey=["']([0-9x][A-Za-z0-9_-]+)["']/);
return match ? match[1] : null;
}
Những thay đổi về quy tắc WAF và tác dụng của chúng
Người vận hành trang web thường xuyên điều chỉnh các quy tắc WAF. Những thay đổi này ảnh hưởng đến tự động hóa:
| Thay đổi | Hiệu ứng tự động hóa | Làm thế nào để phát hiện |
|---|---|---|
| Đã thêm quy tắc | Thử thách mới xuất hiện trên những con đường đã hoạt động | Theo dõi các thay đổi trạng thái 503/403 |
| Đã xóa quy tắc | Thử thách biến mất | 200 ở vị trí 503 trước đây |
| Hành động leo thang (Khối → được quản lý) | Thử thách có thể giải quyết được trở thành khối cứng | 403 thay vì 503 |
| Thư giãn hành động (Quản lý khối →) | Khối cứng trở thành thách thức có thể giải quyết được | 503 với trang thử thách |
| Ngưỡng đã thay đổi (điểm bot 30 → 50) | Nhiều yêu cầu bị thách thức hơn | Tăng tần suất thử thách |
| Phạm vi đường dẫn đã thay đổi | Các URL khác nhau bị ảnh hưởng | Những con đường mới mang lại thử thách |
Chiến lược giám sát
import requests
import time
def monitor_cloudflare_protection(urls, interval=3600):
"""Monitor protection changes across URLs."""
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",
}
last_status = {}
while True:
for url in urls:
try:
response = requests.get(
url, headers=headers, timeout=15, allow_redirects=False
)
status = response.status_code
has_challenge = status == 503 or "cf-turnstile" in response.text
current = {"status": status, "challenge": has_challenge}
previous = last_status.get(url)
if previous and current != previous:
print(f"[CHANGE] {url}")
print(f" Before: {previous}")
print(f" After: {current}")
last_status[url] = current
except requests.RequestException as e:
print(f"[ERROR] {url}: {e}")
time.sleep(interval)
Khắc phục sự cố
| Triệu chứng | Có khả năng quy tắc WAF | sửa chữa |
|---|---|---|
Thử thách chỉ có trên /login |
Quy tắc dựa trên đường dẫn | Giải quyết thử thách cho con đường đó |
| Thử thách chỉ từ IP trung tâm dữ liệu | Điểm bot hoặc quy tắc danh tiếng IP | Sử dụng đa dạng nguồn yêu cầu hoặc giải quyết thách thức |
| Thử thách khác nhau tùy theo quốc gia | Quy tắc dựa trên quốc gia | Sử dụng proxy ở quốc gia được phép hoặc giải quyết |
| Thử thách sau N yêu cầu | Quy tắc dựa trên tỷ lệ | Giảm tỷ lệ yêu cầu hoặc giải quyết từng thử thách |
| Thử thách luôn JS (không bao giờ quay vòng) | Hành động Thử thách JS (không được quản lý) | Sử dụng phương pháp cloudflare_challenge |
| 403 không có thử thách | Hành động chặn (không thể giải quyết được) | Thay đổi IP, tiêu đề hoặc mẫu yêu cầu |
Câu hỏi thường gặp
Tôi có thể xem các quy tắc WAF mà trang web sử dụng không?
Không. Các quy tắc WAF là riêng tư đối với người điều hành trang web. Bạn chỉ có thể suy ra các quy tắc từ hành vi - đường dẫn nào kích hoạt thử thách, từ IP nào và loại thử thách nào xuất hiện.
Các quy tắc WAF có áp dụng cho tất cả các gói Cloudflare không?
Quy tắc WAF tùy chỉnh có sẵn trên tất cả các gói trả phí (Pro, Business, Enterprise). Các gói miễn phí có các quy tắc WAF hạn chế. Tuy nhiên, Thử thách được quản lý có sẵn trên tất cả các gói bao gồm cả Miễn phí.
Các quy tắc WAF có thể kích hoạt các thách thức khác nhau cho các đường dẫn khác nhau không?
Vâng. Mỗi quy tắc WAF có thể có một hành động khác nhau và khớp với các đường dẫn khác nhau. Một trang web có thể sử dụng Thử thách được quản lý cho /login và Thử thách JS cho điểm cuối /api/.
Các trang web có thường xuyên thay đổi quy tắc WAF của họ không?
Nó khác nhau. Các trang thương mại điện tử thường điều chỉnh quy định trong các sự kiện bán hàng. Các trang web quan tâm đến bảo mật có thể cập nhật các quy tắc hàng tuần. Hầu hết các trang web hiếm khi thay đổi quy tắc sau khi thiết lập ban đầu.
Việc giải quyết thách thức WAF có ảnh hưởng đến các yêu cầu trong tương lai không?
Vâng. Sau khi giải quyết, cookie <staging-session-cookie> cho phép các yêu cầu tiếp theo được vượt qua mà không gặp thách thức trong ~30 phút. Cookie được gắn với IP và Tác nhân người dùng của bạn.
Tóm tắt
Các quy tắc WAF của Cloudflare kích hoạt các thử thách CAPTCHA dựa trên các điều kiện có thể định cấu hình: điểm bot, quốc gia, đường dẫn, tiêu đề hoặc tỷ lệ. Hành động phổ biến nhất là Thử thách được quản lý, mà Cloudflare hiển thị một cách thích ứng dưới dạng thử thách vô hình, Cloudflare Turnstile hoặc JS. Giải quyết những điều này vớiCaptchaAIsử dụng phương pháp turnstile hoặc cloudflare_challenge tùy thuộc vào nội dung được hiển thị. Các khối cứng (403) từ quy tắc WAF không thể giải quyết được - thay vào đó hãy thay đổi mẫu yêu cầu hoặc IP của bạn.
bài viết liên quan
- Cloudflare Challenge Vs Phát hiện cửa quay
- Cloudflare Challenge hoạt động như thế nào
- Hướng dẫn về luồng phiên Cloudflare Challenge