Thứ Tư, 25 tháng 11, 2009

Tự tạo captcha đơn giản cho ứng dụng của bạn

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.

<nguồn wikipedia>

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

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

<form method='post'>
<img src='<?php echo $captcha_url ?>' />
<input type='text' name='captcha' />
<input type='submit' value='submit' />
</form>

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é :D

Không có nhận xét nào:

Đăng nhận xét