Trong bài viết này, chúng tôi đã cố gắng trả lời tất cả những câu hỏi quan trọng. Bước đầu tiên để bắt đầu giải quyết vấn đề là xác định hệ thống bảo mật nào đang được sử dụng. Để làm điều đó, bạn có thể tham khảo danh sách các captcha và hệ thống chống bot phổ biến, trong đó có các ví dụ minh họa và những dấu hiệu chính giúp bạn nhanh chóng nhận biết mình đang làm việc với giải pháp nào.
Nếu bạn phát hiện trang web của mình đang sử dụng Cloudflare Turnstile, bước tiếp theo là tìm hiểu chi tiết hơn về các đặc tính và cách hoạt động của nó. Ngay trong bài viết này, bạn cũng có thể xem hướng dẫn tích hợp hệ thống Cloudflare Turnstile để hiểu đầy đủ cách nó vận hành trên trang web của bạn. Điều đó giúp bạn không chỉ nắm rõ lớp bảo vệ hiện tại mà còn lập kế hoạch bảo trì một cách hợp lý.
Khi kiểm thử biểu mẫu chứa Cloudflare Turnstile, bạn thường phải xác minh xem captcha đã tích hợp đúng và hoạt động ổn định chưa.
Bạn có thể tự kiểm tra captcha trên site.
Để giải tự động có thể dùng CapMonster Cloud, dịch vụ nhận tham số captcha, xử lý trên máy chủ của họ và trả về token sẵn dùng. Chèn token này vào form để vượt qua kiểm tra mà không cần tương tác người dùng.
Làm việc với CapMonster Cloud qua API thường gồm các bước:
Trong yêu cầu giải quyết Cloudflare Turnstile, cần chỉ định các tham số sau:
type - TurnstileTask;
websiteURL - địa chỉ của trang nơi CAPTCHA đang được giải quyết;
websiteKey - khóa Turnstile.
https://api.capmonster.cloud/createTask{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "http://tsmanaged.zlsupport.com",
"websiteKey": "0x4AAAAAAABUYP0XeMJF0xoy"
}
}{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"token": "0.iGX3xsyFCkbGePM3jP4P4khLo6TrLukt8ZzBvwuQOvbC...f61f3082"
}
}// npm install playwright @zennolab_com/capmonstercloud-client
import { chromium } from "playwright";
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } from "@zennolab_com/capmonstercloud-client";
async function main() {
// 1. Giải quyết Turnstile qua CapMonster Cloud
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_CAPMONSTER_API_KEY' })
);
const turnstileRequest = new TurnstileRequest({
websiteURL: 'http://tsmanaged.zlsupport.com',
websiteKey: '0x4AAAAAAABUYP0XeMJF0xoy',
});
const result = await cmcClient.Solve(turnstileRequest);
const token = result.solution.token;
console.log('Đã nhận token Turnstile:', token);
// 2. Khởi động Playwright
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('http://tsmanaged.zlsupport.com');
// 3. Điền đăng nhập và mật khẩu
await page.fill('#username', 'your_username');
await page.fill('#password', 'your_password');
// 4. Đợi trường token ẩn xuất hiện
await page.waitForSelector('#token', { state: 'attached', timeout: 60000 });
// 5. Chèn token và làm cho trường hiển thị
await page.evaluate((t) => {
const tokenInput = document.querySelector('#token');
if (tokenInput) {
tokenInput.type = 'text'; // làm cho trường hiển thị
tokenInput.value = t; // chèn token
console.log('Token đã được chèn vào trường token');
} else {
console.error('Không tìm thấy trường #token');
}
}, token);
// 6. Xác minh rằng token đã thực sự được chèn
const checkValue = await page.$eval('#token', el => el.value);
console.log('Kiểm tra giá trị token:', checkValue);
// 7. Gửi biểu mẫu
await page.click('button[type="submit"]');
console.log('Biểu mẫu đã được gửi với token Turnstile');
// await browser.close();
}
main().catch(err => console.error(err));1. Truy cập trang Cloudflare Turnstile, nhấp vào Bắt đầu ngay.
2. Đăng ký dịch vụ.
3. Trong Turnstile Widgets, nhấp vào nút màu xanh Add Widget.

4. Cấu hình Cloudflare Turnstile, chỉ định:
5. Sau khi tạo widget, bạn sẽ nhận được hai khóa—Site Key và Secret Key.

6. Kết nối phần máy khách
1) Kết nối script Turnstile
Hiển thị tự động (widget được tạo tự động khi tải trang):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>Kiểm soát theo chương trình (bạn tự tạo widget qua JavaScript):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" defer></script>Quan trọng: script phải được tải từ URL chính xác. Proxy hoặc bộ nhớ cache có thể gây ra lỗi.
2) Tạo một container cho widget
Tự động:
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>"></div>Theo chương trình:
<div id="turnstile-container"></div>3) Cấu hình widget
Qua thuộc tính data:
<div class="cf-turnstile"
data-sitekey="<YOUR_SITEKEY>"
data-theme="light"
data-size="normal"
data-callback="onSuccess">
</div>Qua JavaScript:
const widgetId = turnstile.render("#turnstile-container", {
sitekey: "<YOUR_SITEKEY>",
theme: "light",
size: "normal",
callback: token => console.log("Token:", token)
});4) Làm việc với token
const token = turnstile.getResponse(widgetId); // lấy token
const isExpired = turnstile.isExpired(widgetId); // kiểm tra hết hạn
turnstile.reset(widgetId); // đặt lại
turnstile.remove(widgetId); // xóa
turnstile.execute("#turnstile-container"); // thực thi thủ công
5) Tích hợp với biểu mẫu
<form id="my-form" method="POST">
<input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
<button type="submit">Gửi</button>
</form>
<script>
function onSuccess(token) {
document.getElementById("cf-turnstile-response").value = token;
}
</script>
<title>Turnstile Example</title>
<!-- Kết nối script Turnstile -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
</head>
<body>
<h1>Ví dụ biểu mẫu với Turnstile</h1>
<form id="my-form">
<label for="username">Tên:</label>
<input type="text" name="username" id="username" required>
<!-- Container cho Turnstile -->
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>" data-callback="onTurnstileSuccess"></div>
<button type="submit">Gửi</button>
</form>
<script>
// Callback được gọi sau khi vượt qua CAPTCHA
function onTurnstileSuccess(token) {
console.log("Đã nhận token Turnstile:", token);
// Lưu token vào trường biểu mẫu ẩn (tùy chọn)
document.getElementById("cf-turnstile-token")?.remove();
const input = document.createElement("input");
input.type = "hidden";
input.name = "cf-turnstile-response";
input.id = "cf-turnstile-token";
input.value = token;
document.getElementById("my-form").appendChild(input);
}
// Gửi biểu mẫu
document.getElementById("my-form").addEventListener("submit", async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const response = await fetch("/submit-form", {
method: "POST",
body: formData
});
const result = await response.json();
if(result.success){
alert("Biểu mẫu đã được gửi thành công và token đã được xác minh!");
} else {
alert("Lỗi xác minh token Turnstile. Vui lòng thử lại.");
// Đặt lại widget để người dùng có thể hoàn thành CAPTCHA lại
turnstile.reset();
}
});
</script>
</body>
</html>
6) Cấu hình phần máy chủ
Quy trình xác minh phía máy chủ:
API Siteverify:
https://challenges.cloudflare.com/turnstile/v0/siteverifyTham số yêu cầu:
Thuộc tính token:
<?php
function validateTurnstile($token, $secret, $remoteip = null) {
$url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
$data = ['secret' => $secret, 'response' => $token];
if ($remoteip) $data['remoteip'] = $remoteip;
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded
",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$response = file_get_contents($url, false, stream_context_create($options));
if ($response === FALSE) {
return ['success' => false, 'error-codes' => ['internal-error']];
}
return json_decode($response, true);
}
// Sử dụng
$secret_key = 'YOUR_SECRET_KEY';
$token = $_POST['cf-turnstile-response'] ?? '';
$remoteip = $_SERVER['REMOTE_ADDR'];
$result = validateTurnstile($token, $secret_key, $remoteip);
if($result['success']){
echo "Biểu mẫu đã được gửi thành công!";
} else {
echo "Lỗi xác minh: " . implode(', ', $result['error-codes']);
}
?>
Nếu bạn tiếp quản một trang web đã được cài sẵn captcha hoặc một hệ thống bảo vệ khác nhưng lại không có quyền truy cập vào mã nguồn thì cũng không có gì đáng lo! Việc xác định chính xác công nghệ nào đang được sử dụng khá đơn giản. Để kiểm tra xem mọi thứ có hoạt động đúng hay không, bạn có thể dùng dịch vụ nhận dạng CapMonster Cloud trong một môi trường thử nghiệm tách biệt nhằm đảm bảo cơ chế xử lý token và logic kiểm tra đang vận hành chính xác.
Với Cloudflare Turnstile, bạn chỉ cần nhận diện hệ thống, quan sát hành vi của nó và xác nhận rằng lớp bảo vệ hoạt động đúng cách. Trong bài viết này, chúng tôi đã chỉ ra cách nhận biết Cloudflare Turnstile và nơi tìm hướng dẫn tích hợp hoặc cấu hình lại, giúp bạn tự tin duy trì lớp bảo vệ và kiểm soát hoạt động của nó.