Skip to content

Thiết lập Cloudflare Turnstile chống spam trong PHP

Một giải pháp nhẹ hơn, gần như “vô hình” với người dùng thay thế Google reCAPTCHA.
Khi triển khai form đăng ký trong production, một vấn đề rất phổ biến là:
Bot spam tạo tài khoản hàng loạt
Fake email / username làm bẩn database
Tăng tải không cần thiết lên server
Trước đây, nhiều hệ thống dùng Google reCAPTCHA, nhưng:
UX không tốt (phải click chọn ảnh)
Dễ bị bypass nếu cấu hình không kỹ
Một giải pháp nhẹ hơn, gần như “vô hình” với người dùng là Cloudflare Turnstile.

Turnstile là gì?

Turnstile là một dịch vụ chống bot của Cloudflare
Hoạt động tương tự CAPTCHA nhưng:
Không cần người dùng tương tác
Nhẹ hơn reCAPTCHA
Tập trung vào trải nghiệm người dùng
👉 Về cơ bản:
Frontend: render widget → sinh token
Backend: verify token → xác nhận người dùng hợp lệ

Tích hợp vào form đăng ký (PHP)

Giả sử bạn đang có form như trong file register.php

Bước 1: Thêm script Turnstile

Thêm vào cuối file (trước </body>):
👉 Script này sẽ tự động render widget

Bước 2: Thêm widget vào form

Trong <form id='frmRegister'>, thêm:
Giải thích:
cf-turnstile: class để Cloudflare nhận diện
data-sitekey: public key (lấy từ dashboard)

Bước 3: Lấy token khi submit

Form của bạn đang submit bằng JS:
Cập nhật hàm:
Giải thích:
Turnstile sẽ tự tạo input hidden: cf-turnstile-response
Bạn lấy token này và gửi về server để verify

Bước 4: Verify ở backend (PHP)

Tạo file register_submit.php:
Giải thích:
Gửi request tới API verify của Cloudflare
Nếu success = false → chặn đăng ký
Nếu true → cho phép xử lý tiếp

Lấy Site Key và Secret Key

Vào dashboard của Cloudflare:
Turnstile → Add site
Lấy:
Site Key (frontend)
Secret Key (backend)

Một số lưu ý quan trọng (Best Practices)

✅ Nên làm

Verify token ở backend (bắt buộc)
Kết hợp thêm:
validate input
check trùng email / username
Reset Turnstile nếu submit fail:

❌ Không nên

❌ Tin tưởng token ở frontend
❌ Bỏ qua bước verify server
❌ Dùng lại token nhiều lần

Mở rộng (nâng cao)

Bạn có thể kết hợp thêm:
Rate limit đăng ký theo IP
Honeypot field (input ẩn chống bot)
Logging request nghi ngờ

Tổng kết

Trong bài này, bạn đã:
Hiểu Turnstile là gì
Tích hợp vào form PHP
Gửi token từ frontend
Verify ở backend
👉 Ưu điểm lớn nhất:
UX tốt hơn CAPTCHA truyền thống
Dễ tích hợp
Phù hợp production
Want to print your doc?
This is not the way.
Try clicking the ··· in the right corner or using a keyboard shortcut (
CtrlP
) instead.