Trong lập trình web, bảo mật form nhập liệu là một trong những mối quan tâm hàng đầu. Các bot tự động có thể lợi dụng form để gửi hàng loạt request spam, gây ảnh hưởng đến hệ thống và trải nghiệm người dùng. Một trong những cách hiệu quả nhất để ngăn chặn điều này chính là sử dụng CAPTCHA. Đây là kỹ thuật tạo ra các bài kiểm tra đơn giản mà con người dễ dàng vượt qua nhưng bot lại khó xử lý.
Nếu bạn đã từng nghiên cứu các kỹ thuật bảo mật cơ bản như giữ đăng nhập bằng Session trong PHP hay nhớ mật khẩu bằng cookie trong PHP, thì CAPTCHA sẽ là bước nâng cấp tiếp theo giúp bảo vệ form nhập liệu. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách tạo CAPTCHA đơn giản bằng PHP kết hợp cookie và session, đồng thời phân tích ưu nhược điểm và cách cải tiến để đạt chuẩn bảo mật cao hơn.
CAPTCHA là gì và tại sao cần thiết?
CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) là một bài kiểm tra nhằm phân biệt con người và máy tính. Nó được thiết kế để ngăn chặn bot tự động truy cập, gửi dữ liệu hoặc spam vào các form web.
Khi một form được bảo vệ bằng CAPTCHA, người dùng sẽ phải nhập lại một chuỗi ký tự hiển thị trong hình ảnh (hoặc giải một câu đố đơn giản). Bot khó lòng vượt qua thử thách này bởi nó đòi hỏi nhận diện hình ảnh và khả năng hiểu ngữ cảnh.
Việc bổ sung CAPTCHA vào form liên hệ, form đăng ký hoặc bình luận là cực kỳ quan trọng. Nó giúp:
-
Hạn chế spam tự động.
-
Giảm tải server do bot gửi request liên tục.
-
Đảm bảo dữ liệu form hợp lệ hơn.
Quy trình hoạt động của CAPTCHA trong PHP
Để hiểu cách xây dựng CAPTCHA đơn giản trong PHP, bạn cần nắm được quy trình cơ bản sau:
- Sinh chuỗi ngẫu nhiên: Một chuỗi gồm chữ và số (ví dụ:
AB12C) sẽ được tạo. - Lưu chuỗi vào session: Session giúp server ghi nhớ giá trị này để so sánh.
- Vẽ hình ảnh chứa chuỗi: Sử dụng GD library của PHP để vẽ hình ảnh có chữ và nhiễu.
- Nhúng ảnh vào form: Hiển thị ảnh CAPTCHA và cung cấp ô input cho người dùng nhập lại.
- Xác thực dữ liệu: Khi form submit, PHP sẽ so sánh giá trị nhập với giá trị lưu trong session.
Nếu khớp, form được xử lý. Nếu sai, hiển thị thông báo lỗi.
Tạo chuỗi ngẫu nhiên và lưu vào session
Trước khi viết code, bạn cần hiểu rằng CAPTCHA hiệu quả phải có sự ngẫu nhiên đủ lớn. Nếu chỉ sinh chuỗi quá ngắn hoặc đơn giản, bot có thể dễ dàng brute-force. Chuỗi ngẫu nhiên nên chứa chữ hoa, chữ thường và số, đồng thời tránh ký tự dễ gây nhầm lẫn như 0 và O, 1 và l.
Ngoài ra, session là cơ chế lưu trạng thái ở phía server, đảm bảo dữ liệu CAPTCHA không thể bị giả mạo từ phía client. Đây là cách an toàn nhất để xác thực dữ liệu người dùng nhập vào form.
<?php session_start(); // Tạo chuỗi ngẫu nhiên $characters = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; $captcha_text = substr(str_shuffle($characters), 0, 6); // Lưu vào session $_SESSION['captcha'] = $captcha_text; ?>
Vẽ ảnh CAPTCHA bằng GD library
Trước khi viết code, bạn cần hiểu GD library là thư viện tích hợp sẵn trong PHP, cho phép xử lý ảnh (vẽ chữ, thêm nhiễu, tô màu). Với CAPTCHA, GD library có thể tạo ảnh PNG hoặc JPEG chứa chữ ngẫu nhiên.
Nguyên tắc cơ bản khi vẽ CAPTCHA:
-
Tạo canvas ảnh với kích thước phù hợp.
-
Chọn màu nền và màu chữ tương phản.
-
Thêm nhiễu (noise) bằng đường kẻ hoặc chấm nhỏ.
-
Xuất ảnh dưới dạng PNG hoặc JPEG.
<?php
session_start();
$captcha_text = $_SESSION['captcha'];
// Kích thước ảnh
$width = 150;
$height = 50;
$image = imagecreatetruecolor($width, $height);
// Màu nền và màu chữ
$bg_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 0, 0, 0);
$noise_color = imagecolorallocate($image, 100, 120, 180);
// Vẽ nền
imagefilledrectangle($image, 0, 0, $width, $height, $bg_color);
// Thêm nhiễu
for ($i = 0; $i < 200; $i++) {
imagesetpixel($image, rand(0,$width), rand(0,$height), $noise_color);
}
// Vẽ chữ
$font_size = 5;
imagestring($image, $font_size, 40, 15, $captcha_text, $text_color);
// Xuất ảnh
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);
?>
Thêm CAPTCHA vào form HTML
Trước khi viết code, bạn cần hình dung rằng form HTML sẽ gọi file PHP sinh ảnh CAPTCHA, ví dụ captcha.php. Người dùng nhìn thấy ảnh, nhập lại ký tự, sau đó submit cùng form. Đây là cách phổ biến và đơn giản nhất để tích hợp CAPTCHA.
Để tăng trải nghiệm, bạn có thể thêm nút “Reload CAPTCHA” bằng JavaScript, cho phép người dùng đổi ảnh mới nếu khó đọc.
<form action="process.php" method="post"> <label for="name">Tên:</label> <input type="text" name="name" required><br> <label for="message">Nội dung:</label> <textarea name="message" required></textarea><br> <label for="captcha">Mã CAPTCHA:</label> <img src="captcha.php" alt="CAPTCHA"><br> <input type="text" name="captcha" required><br> <button type="submit">Gửi</button> </form>
Kiểm tra CAPTCHA khi submit form
Trước khi viết code, hãy nhớ rằng việc so sánh giá trị CAPTCHA phải diễn ra ở phía server. Dữ liệu từ người dùng nhập vào sẽ được so khớp với session đã lưu. Nếu khớp, form hợp lệ. Nếu sai, trả về lỗi.
Quan trọng: sau khi xác thực xong, bạn có thể xóa session CAPTCHA để tránh tái sử dụng.

