Cloudflare Turnstile
và CapMonster Cloud

Giải quyết CAPTCHA, cài đặt trên trang web và kiểm tra.

Giá của giải pháp Cloudflare Turnstile

CAPTCHA
Giá (USD)
$ 1.30
1000 token
Bạn nhận lại một website đã có captcha hoặc lớp bảo vệ khác nhưng không có quyền truy cập mã nguồn? Khi đó điều bạn cần biết là giải pháp nào đang chạy, cấu hình có đúng không và cách kiểm tra như thế nào.

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ý.

Cloudflare Turnstile là gì
Cloudflare Turnstile là gì
Cloudflare Turnstile là một CAPTCHA hiện đại từ Cloudflare bảo vệ các trang web khỏi các hành động tự động. Đối với khách truy cập trang web, việc xác minh gần như vô hình, không cần phải hoàn thành các nhiệm vụ: thường chỉ cần một cú nhấp chuột vào hộp kiểm, sau đó hệ thống quyết định cho phép khách truy cập qua hay chặn nếu nghi ngờ là bot. Khác với Cloudflare Challenge, CAPTCHA Turnstile được đặt trực tiếp trên trang web, không phải trong cửa sổ riêng—thường là trong các biểu mẫu đăng nhập hoặc đăng ký.

Cách giải quyết Cloudflare Turnstile qua CapMonster Cloud

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.

  • Mở trang có form và đảm bảo captcha hiển thị.
  • Thử gửi form mà không giải captcha — máy chủ phải trả lỗi.
  • Sau khi giải thành công, form phải gửi đi trơn tru.

Để 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:

Tạo nhiệm vụTạo nhiệm vụ
arrow
Gửi yêu cầu APIGửi yêu cầu API
arrow
Nhận kết quảNhận kết quả
arrow
Áp dụng token lên trangÁp dụng token lên trang
arrow
Nhận dạng Cloudflare Turnstile sử dụng thư viện có sẵn
Dịch vụ CapMonster Cloud cung cấp các thư viện có sẵn để làm việc thuận tiện trong các ngôn ngữ Python, JavaScript (Node.js) và C#.
Python
JavaScript
C#
Giải quyết, chèn token và gửi biểu mẫu
Ví dụ trong Node.js cho chu trình đầy đủ nhận dạng CAPTCHA trên trang web của bạn. Các cách tiếp cận có thể: sử dụng các yêu cầu HTTP để lấy HTML và các tham số CAPTCHA, gửi phản hồi và xử lý kết quả; hoặc với các công cụ tự động hóa (ví dụ: Playwright)—mở trang, đợi CAPTCHA, gửi các tham số (để kiểm tra bạn có thể gửi cả dữ liệu đúng và sai), nhận giải pháp qua máy khách CapMonster Cloud, chèn token vào biểu mẫu và xem kết quả.
python
// 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));
Cách kết nối Cloudflare Turnstile với trang web của bạn
Để tự tin điều hướng hoạt động của CAPTCHA trên trang web của bạn, hiểu logic xác minh của nó, kết nối lại hoặc cấu hình lại, chúng tôi khuyên bạn nên nghiên cứu phần này. Nó mô tả quy trình kết nối bảo vệ—điều này sẽ giúp bạn nhanh chóng hiểu tất cả các sắc thái.

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.

HowTo Connect image 1

4. Cấu hình Cloudflare Turnstile, chỉ định:

  • Widget name—tên của CAPTCHA (để thuận tiện, ví dụ: Login form).
  • Hostname Management—các tên miền nơi CAPTCHA sẽ hoạt động (ví dụ: example.com).
  • Widget Mode:
    • Managed—tùy chọn tối ưu, CAPTCHA tự quyết định có hiển thị hộp kiểm hay không.
    • Non-interactive—xác minh được thực hiện tự động mà không cần nhấp chuột.
    • Invisible—hoàn toàn vô hình.
  • Pre-clearance—đặt thành Yes nếu trang web đi qua Cloudflare Proxy (để không lặp lại CAPTCHA).

5. Sau khi tạo widget, bạn sẽ nhận được hai khóa—Site KeySecret Key.

HowTo Connect image 2

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):

markup
<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):

markup
<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:

markup
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>"></div>

Theo chương trình:

markup
<div id="turnstile-container"></div>

3) Cấu hình widget

Qua thuộc tính data:

markup
<div class="cf-turnstile"
            data-sitekey="<YOUR_SITEKEY>"
            data-theme="light"
            data-size="normal"
            data-callback="onSuccess">
          </div>

Qua JavaScript:

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

javascript
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

markup
<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>

Ví dụ mãVí dụ mã
arrow

6) Cấu hình phần máy chủ

Quy trình xác minh phía máy chủ:

  • Máy khách: người dùng hoàn thành Turnstile trên trang → token được tạo.
  • Biểu mẫu được gửi: token cùng với dữ liệu biểu mẫu được gửi đến máy chủ.
  • Máy chủ: thực hiện yêu cầu POST đến API Siteverify của Cloudflare với token và bí mật.
  • Cloudflare: trả về JSON với kết quả (success: true/false) và thông tin bổ sung (action, hostname, thời gian hoàn thành).
  • Máy chủ: quyết định cho phép hoặc từ chối hành động của người dùng.

API Siteverify:

javascript
POST
https://challenges.cloudflare.com/turnstile/v0/siteverify

Tham số yêu cầu:

  • secret (bắt buộc): khóa bí mật Turnstile từ bảng điều khiển Cloudflare
  • response (bắt buộc): token nhận được trên máy khách
  • remoteip (tùy chọn): địa chỉ IP của người dùng (khuyến nghị)
  • idempotency_key (tùy chọn): UUID duy nhất để bảo vệ chống xác minh lặp lại

Thuộc tính token:

  • Độ dài tối đa: 2048 ký tự
  • Có hiệu lực trong 5 phút
  • Sử dụng một lần
  • Khi hết hạn hoặc xác minh lại, API sẽ trả về lỗi timeout-or-duplicate

Ví dụ xác minh trong PHPVí dụ xác minh trong PHP
arrow

Background
Các lỗi thường gặp và cách xử lý
Bug Icon
Tham số không chính xác
CAPTCHA không hiển thị hoặc trả về lỗi như invalid-input-secret, missing-input-response, invalid-input-response. Kiểm tra tính hợp lệ của sitekeysecret key, cũng như cài đặt trong Bảng điều khiển Cloudflare.
Bug Icon
Hết thời gian giải quyết
Token đã hết hạn (có hiệu lực trong 300 giây) hoặc không được nhận kịp thời. Đảm bảo kết nối ổn định và tích hợp API chính xác.
Bug Icon
Token trống hoặc không chính xác
Tham số cf-turnstile-response bị thiếu hoặc không chính xác. Kiểm tra việc chuyển token đến biểu mẫu và máy chủ.
Bug Icon
Phản hồi success=false
Token không hợp lệ, đã hết hạn hoặc đã được sử dụng. Mỗi token chỉ có thể được xác minh một lần. Bật ghi nhật ký các yêu cầu và phản hồi Siteverify để phân tích.
Kiểm tra độ bền vững của lớp bảo vệ
Sau khi tích hợp, hãy đảm bảo hệ thống thực sự chặn được những hành động tự động.
Khuyến nghị về bảo mật và tối ưu
Xác minh token chỉ trên máy chủ, không bao giờ gọi API Siteverify từ frontend—điều này sẽ lộ khóa bí mật của bạn.
Sử dụng biến môi trường hoặc hệ thống quản lý bí mật thay vì lưu trữ khóa trong mã.
Kiểm tra các trường bổ sung (<span class="font-bold">hostname</span>, <span class="font-bold">action</span>) để đảm bảo yêu cầu đến từ trang web của bạn.
Sử dụng HTTPS—tất cả các cuộc gọi đến Siteverify phải được thực hiện qua kết nối an toàn.
Triển khai xử lý lỗi—khi API không khả dụng, hiển thị cho người dùng thông báo rõ ràng mà không tiết lộ dữ liệu nội bộ.
Hạn chế việc sử dụng sitekey theo tên miền.
Thêm liên kết đến <span class="font-bold">Chính sách bảo mật</span> và <span class="font-bold">Điều khoản dịch vụ Cloudflare</span> vào biểu mẫu nếu tổ chức hoặc chính sách bảo mật của bạn yêu cầu.
Kết luận

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ó.

Conclusion

Câu hỏi thường gặp về Cloudflare Turnstile

Để giải Cloudflare Turnstile bằng CapMonster Cloud:

Gửi yêu cầu POST đến https://api.capmonster.cloud/createTask với các tham số JSON sau:

json
{
  "clientKey": "API_KEY",
  "task": {
    "type": "TurnstileTask",
    "websiteURL": "[page_URL_with_Turnstile]",
    "websiteKey": "[Turnstile_website_key]"
  }
}
  • clientKey: Khóa API CapMonster Cloud của bạn
  • task.type: TurnstileTask
  • task.websiteURL: URL của trang nơi captcha được giải
  • task.websiteKey: Khóa Turnstile site key. Xem cách tìm khóa.

API trả về taskId.

Truy vấn https://api.capmonster.cloud/getTaskResult với clientKey và taskId cho đến khi trạng thái phản hồi trở thành ready.

Khi nhiệm vụ được giải, phản hồi bao gồm token và userAgent tương ứng.

Truyền cả hai giá trị vào cùng phiên trình duyệt sẽ gửi biểu mẫu.

Xem tài liệu nhiệm vụ Turnstile để biết chi tiết và ví dụ.

Cloudflare Turnstile hỗ trợ ba chế độ widget:

  • Managed: Turnstile quyết định hiển thị kiểm tra tương tác hay cho khách truy cập đi qua im lặng dựa trên mức rủi ro.
  • Non-interactive: Chạy mà không cần tương tác người dùng nhưng vẫn hiển thị widget trong khi thực hiện kiểm tra.
  • Invisible: Cũng chạy mà không cần tương tác người dùng, nhưng widget không được hiển thị cho khách truy cập.

Khi backend của bạn nhận token Turnstile từ client:

Gửi nó bằng POST đến https://challenges.cloudflare.com/turnstile/v0/siteverify với các tham số:

  • secret: Khóa bí mật của widget từ bảng điều khiển Cloudflare
  • response: Token từ widget phía client
  • remoteip (tùy chọn): Địa chỉ IP của khách truy cập
  • idempotency_key (tùy chọn): UUID do bạn tạo để thử lại xác thực an toàn

Endpoint chấp nhận cả application/x-www-form-urlencodedapplication/json.

Nếu token xác minh thành công, Cloudflare trả về success: true.

Sử dụng page.evaluate() hoặc phương thức cấp DOM khác để chèn token vào trường có [name="cf-turnstile-response"] trước khi gửi biểu mẫu.

Lưu ý rằng một số tích hợp cũng dựa vào callback hoặc trình xử lý JavaScript tùy chỉnh. Trong trường hợp này, gọi hàm callback JS của widget (được định nghĩa trong data-callback) và truyền token nhận được đến xác minh máy chủ.

Lỗi timeout-or-duplicate từ Turnstile siteverify thường có nghĩa là token đã hết hạn trước khi xác minh hoặc được gửi nhiều lần. Token Turnstile chỉ dùng một lần và hết hạn sau năm phút.

Để gỡ lỗi:

  • Bật ghi log yêu cầu đến https://challenges.cloudflare.com/turnstile/v0/siteverify
  • So sánh thời gian tạo token với thời gian xác minh.
  • Kiểm tra xem backend có xác minh cùng một token hai lần không, ví dụ trong quá trình thử lại, chuyển hướng hoặc xử lý yêu cầu trùng lặp.