Bài viết này bao gồm các phần:
- captcha là gì
- captcha được tạo như thế nào
- tiến hành code
- viết thành thư viện để sử dụng lại
1. Captcha là gì?
Một CAPTCHA (ˈkæptʃə, đọc giống như “capture”) là một loại kiểm thử dạng hỏi đáp được dùng trong máy tính để xác định xem người dùng có phải là con người hay không. “CAPTCHA” là một dạng sắp đặt chữ đầu của “Completely Automated Public Turing test to tell Computers and Humans Apart” (Phép thử Turing công cộng hoàn toàn tự động để phân biệt máy tính với người), được trường Đại học Carnegie Mellon cố gắng đăng kí thương hiệu nhưng đã bị bác bỏ. Đây là một quá trình một máy tính (máy chủ) yêu cầu một người dùng hoàn tất một kiểm tra đơn giản mà máy tính có thể dễ dàng tạo ra và đánh giá, nhưng không thể tự giải nó được. Vì máy tính không thể giải quyết CAPTCHA, bất kỳ người dùng nào nhập vào lời giải đúng sẽ được xem là con người.
Thuật ngữ CAPTCHA được Luis von Ahn, Manuel Blum, Nicholas J. Hopper (tất cả đều thuộc Đại học Carnegie Mellon), và John Langford (khi đó thuộc IBM) đặt ra vào năm 2000. Một loại CAPTCHA phổ biến yêu cầu người dùng phải nhập các chữ cái trong một tấm hình méo mó, đôi khi cùng với một dãy số hoặc chữ lờ mờ xuất hiện trên màn hình.
Một CAPTCHA đôi khi được mô tả như một phép thử Turing ngược, vì nó được một máy tạo ra và nhắm vào con người, ngược lại với phép thử Turing chuẩn do con người tạo ra và nhắm vào máy.
2. captcha được tạo như thế nào
Đầu tiên ta cần phải ghi ra file ảnhtừ các chuỗi random.
Lưu chuỗi random này vào session.
So sánh chuỗi random trong session với request được gửi lên
Nếu chính xác thì thự hiện tiến trình
Nếu không thì trả về lỗi.
3. code nào
Đầu tiên để có thể ghi 1 string lên image file, tôi đi tìm đọc về thư viện image của php:
http://www.php.net/manual/en/ref.image.php
Có rất nhiều, keyword tôi quan tâm là draw – string – images
Lúc này có 2 sự lựa chọn tôi tìm thấy.1 là có file ảnh sẵn, đọc và ghi và file đó.2 sử dụng 1 file php, gen ra ảnh khi có parameter.
Cách 1 xem chừng khá đơn giản, nhưng chỉ chạy được khi có 1 request. còn nhiều req thì chịu
Cách thứ 2 tôi đã chọn, truyền chuỗi vào nó tự gen ra ngay trên phía client 1 file có header dạng image.
Như vậy tôi có 2 file:
- gen_image.php
- test.php
—> GEN_IMAGE.PHP —>
// thông báo đây là image type
header (“Content-type: image/png”);
$img=ImageCreate(80,30); // quy định kích cỡ của ảnh
$bgcolor=ImageColorAllocate($img,255,255,255); // cho màu nền là màu trắng
$red=ImagecolorAllocate($img,255,0,0); // quy định chữ màu đỏ cho nổi
ImageString($img,10,10,10, $_REQUEST['text'],$red); // add cái text lấy được từ request vào obj image
ImageSetPixel($img,50,50,$red);
ImagePNG($img);
ImageDestroy($img);
?>
Như vậy là xong file gen_image.php. Nếu bạn gõ địa chỉ gen_image.php?text=”abcabc”, nó sẽ gen ra ảnh png với text trong ảnh là abcabc
Giờ tạo file test nào:
- chúng ta cần 1 hàm cho ra chuỗi random, ở đây tôi mượn hàn gen ra chuỗi mã màu random
function get_random_color()
{
$c=”;
for ($i = 0; $i<6; $i++)
{
$c .= dechex(rand(0,15));
}
return “$c”;
}
Giờ đến phần phân tích xem user gõ cái gì vào hay không và so sánh với chuỗi k tự trong session
$captcha = get_random_color();
$captcha_url = ”;
if( !isset($_SESSION['dCaptchaContentb']) || !isset($_REQUEST['captcha']))
{
$_SESSION['dCaptchaContentb'] = $captcha;
$captcha_url = ‘/gen.php?text=’.$captcha;
}
else if(isset($_REQUEST['captcha']))
{
if($_SESSION['dCaptchaContentb'] == $_REQUEST['captcha'])
{
//proccess
}
else
{
//noproccess
}
unsset($_SESSION['dCaptchaContentb']);
}
Tạo form ở bên dưới test
Giờ là lúc test thử xem ok không
4. viết thành thư viện để sử dụng lại
phần này mọi người thực hành xem sao nhé
(i-php.net)