CAPTCHA có đó — nhưng không bảo vệ được gì
Widget reCAPTCHA, hCaptcha hoặc Turnstile hiển thị không nói lên nhiều điều về mức bảo vệ của biểu mẫu. Đây là những cấu hình sai thường gặp và cách kiểm tra biểu mẫu của bạn trong vài phút.
Nhiều chủ website thêm CAPTCHA vào biểu mẫu liên hệ, thấy huy hiệu nhỏ hoặc ô đánh dấu xuất hiện và cho rằng vấn đề thư rác đã được giải quyết. Nhưng thư rác vẫn đến. Thường bản thân CAPTCHA không có lỗi — nó chỉ chưa được nối với bất cứ thứ gì có thể chặn bot. Bài viết này trình bày những cách phổ biến khiến reCAPTCHA, hCaptcha và Cloudflare Turnstile trở thành đồ trang trí, cùng cách kiểm tra biểu mẫu của bạn.
Nơi sự bảo vệ thực sự diễn ra
Cả ba dịch vụ đều hoạt động theo cùng nguyên tắc. Một tập lệnh trong trình duyệt thực hiện kiểm tra rồi đưa cho biểu mẫu một token — chuỗi ngắn nói rằng “khách này đã vượt qua”. Token đi cùng lần gửi biểu mẫu tới máy chủ của bạn. Chỉ ở đó quyết định thực sự mới được đưa ra: máy chủ gửi token cùng khóa bí mật tới nhà cung cấp và nhận câu trả lời thành công hoặc thất bại, với reCAPTCHA v3 còn có điểm số. Thiếu bất kỳ mắt xích nào, widget vẫn trông hoàn toàn bình thường nhưng bot gửi thẳng tới bộ xử lý biểu mẫu sẽ đi qua ngay.
Khóa thử nghiệm cho mọi thứ đi qua
Google, hCaptcha và Cloudflare công bố khóa thử nghiệm riêng để nhà phát triển chạy kiểm thử tự động mà không cần giải câu đố. Với khóa bí mật thử nghiệm tương ứng, xác minh luôn thành công — đó chính là mục đích của chúng. Chúng dành cho môi trường cục bộ và thử nghiệm trước triển khai, nhưng thường vẫn tồn tại khi chuyển sang website thật: nhà phát triển dán chúng vào lúc xây dựng, website được đưa lên hoạt động và không ai thay chúng. Ít nhất reCAPTCHA hiện thông báo trong widget rằng chỉ dùng để thử nghiệm, nhưng với cấu hình vô hình thì hầu như chẳng ai nhìn. Nếu cả khóa website thử nghiệm lẫn khóa bí mật thử nghiệm cùng được dùng trên website thật, mọi lần gửi đều vượt qua, từ người hay bot; nếu chỉ khóa website là khóa thử nghiệm, xác minh sẽ thất bại và tin nhắn thật có thể bị từ chối.
Token không ai kiểm tra
Trường hợp kinh điển thứ hai là máy chủ không bao giờ hỏi nhà cung cấp. Widget chạy, token được tạo và gửi, rồi bộ xử lý biểu mẫu cứ thế bỏ qua. Nguồn gốc thường là biểu mẫu viết tay, đoạn mã sao chép chỉ bao gồm phần trình duyệt và cài đặt tiện ích còn dang dở. Trường hợp gần giống là máy chủ có gọi dịch vụ xác minh nhưng chỉ kiểm tra yêu cầu đã thực hiện được hay chưa, không xem câu trả lời nói gì. Hoặc ngưỡng điểm reCAPTCHA v3 được đặt là 0, chấp nhận mọi điểm số dịch vụ có thể trả về. Một số bộ xử lý còn cho qua khi lỗi (“fail open”): nếu thiếu token hoặc xác minh thất bại, chúng vẫn chấp nhận tin nhắn — và bot chỉ cần bỏ token đi.
Khi widget không bao giờ thực sự tải
Các cấu hình sai khác lại làm hỏng phía trình duyệt. Nếu khóa website chưa được đăng ký cho tên miền — thường gặp khi chuyển từ môi trường thử nghiệm trước triển khai sang môi trường vận hành chính thức, đổi tên miền hoặc thêm tên miền phụ — nhà cung cấp sẽ không phát hành token và hiển thị lỗi trong widget hoặc bảng điều khiển trình duyệt. Sau khi đổi giao diện hoặc cập nhật tiện ích, mã widget có thể vẫn nằm trên trang nhưng tập lệnh làm nó hoạt động đã biến mất. Công cụ đồng ý cookie cũng có thể gây tác động tương tự nếu chặn tập lệnh CAPTCHA cho tới khi khách đồng ý. Điều xảy ra tiếp theo phụ thuộc máy chủ: nếu nó đòi token hợp lệ, khách thật không thể gửi tin nhắn nữa và không ai nhận ra các yêu cầu bị mất; nếu không đòi, bot sẽ đi qua tự do.
Hai trường hợp khác cũng dễ bị bỏ sót. Với reCAPTCHA v3, huy hiệu ở góc chỉ cho biết tập lệnh được tải ở đâu đó trên trang — có thể bởi giao diện hoặc tiện ích khác — trong khi tích hợp của chính tiện ích biểu mẫu đã tắt. Tiện ích lưu bộ nhớ đệm còn có thể lưu trang cùng token nhúng trong HTML. Token CAPTCHA chỉ có hiệu lực vài phút và chỉ được xác minh một lần, nên token trong bộ nhớ đệm sẽ thất bại với khách thật; cách “sửa” hấp dẫn là tắt kiểm tra sẽ âm thầm loại bỏ lớp bảo vệ.
- Widget hiện thông báo “chỉ dùng cho mục đích thử nghiệm”
- Huy hiệu v3 nằm ở góc
- Widget hiển thị và trả về token
- Thư rác dừng lại — nhưng yêu cầu thật cũng vậy
- Đang dùng khóa thử nghiệm công khai và mọi lần xác minh đều thành công
- Tích hợp reCAPTCHA của tiện ích biểu mẫu đã tắt
- Máy chủ không bao giờ gửi token đi xác minh hoặc bỏ qua kết quả
- Khóa website chưa đăng ký cho tên miền hoặc token trong bộ nhớ đệm đã hết hạn
Tự kiểm tra nhanh
- 1Mở trang biểu mẫu trong cửa sổ riêng tư, mở công cụ nhà phát triển của trình duyệt và tìm lỗi từ tập lệnh CAPTCHA trong bảng điều khiển.
- 2Kiểm tra widget có thực sự xuất hiện — một lần trước và một lần sau khi chấp nhận biểu ngữ cookie — và biểu mẫu không thể gửi khi thiếu widget.
- 3Trong bảng quản trị của nhà cung cấp, kiểm tra khóa website có liệt kê tên miền đang vận hành của bạn, kể cả biến thể như www, và các khóa trong tiện ích biểu mẫu hoặc mã có khớp với nó, không phải khóa từ tài liệu hay cấu hình thử nghiệm trước triển khai.
- 4Trong cài đặt tiện ích biểu mẫu, bảo đảm tích hợp CAPTCHA đã bật cho đúng biểu mẫu này; với reCAPTCHA v3, kiểm tra ngưỡng điểm lớn hơn 0.
- 5Nếu có quyền truy cập mã, tìm phần xác minh phía máy chủ và kiểm tra nó từ chối lần gửi khi câu trả lời tiêu cực hoặc thiếu token.
- 6Loại trang biểu mẫu khỏi bộ nhớ đệm toàn trang hoặc bảo đảm token được tạo mới trong trình duyệt.
- 7Gửi tin nhắn thử thật và kiểm tra nó đến; lặp lại sau khi thay đổi giao diện, tiện ích hoặc công cụ đồng ý.
CAPTCHA là một lớp, không phải toàn bộ sự bảo vệ. Khi kết hợp với trường honeypot, kiểm tra thời gian và lọc phía máy chủ, cấu hình sai ở một chỗ không khiến biểu mẫu mở toang. Muốn nhanh chóng biết tình trạng biểu mẫu, hãy nhập tên miền trên formexposed.com — báo cáo cho biết các phần cấu hình CAPTCHA nhìn thấy được từ bên ngoài có ổn hay không.