Tuesday, October 18, 2005

Tạo ảnh động dùng để kiểm tra chống Flood với PHP

Vừa đọc được 1 bài khá hay từ vndeveloper.com site của chú Trí mập (ĐHBK - Pyramid Consultant Co.) . Tham khảo tại http://www.vndn.net/7.30.aspx
-------------
1. Giới thiệu:

Khi bạn đăng ký với mail Yahoo!, chắc hẳn các bạn phải gõ vào một mã mà bạn phải đọc trên một hình nằm trong form đăng ký, và mã này dùng để kiểm tra tính xác thực xem bạn có phải là một con người thật sự hay không? Hay là script đăng ký đang được một chương trình chạy tự động, vì chỉ có con người mới đọc được mấy chữ cái và chữ số lùng nhùng trên cái hình đó thôi. :) Người ta dùng cách này để chống đăng ký hàng loạt member (hay thuật ngữ mà hacker thường gọi flood register). Thực hiện điều này cho script của bạn viết cũng không có gì phức tạp, phần sau sẽ hướng dẫn bạn cách hiện thực chức năng này trong các script mà bạn cần chống flood.

2. Kỹ thuật thực hiện

Để thực hiện chức năng chống Flood bằng hình ảnh này, chúng ta phải tạo ra một ảnh mà mỗi lần xem nó sẽ sinh ra một dãy chữ và số khác nhau, và chỉ có con người mới đọc được cái mã này. Chúng ta có thể thực hiện được điều này với PHP bằng cách sử dụng các hàm xử lý ảnh của thư viện GD2 mà PHP hỗ trợ. (Lưu ý: PHP phải được cấu hình để hỗ trợ dùng thư viện mở rộng GD2).

Các bạn có thể xem đoạn code bên dưới làm điều này như thế nào nhé.

// File: verify.php
// Khai báo header, dùng để báo cho browser biết đây là một ảnh JPEG
// và tắt chức năng cache của browser để tránh tình trạng bị hình bị cache.
header("Content-Type: image/jpeg");
header("Pragma: No-cache");
header("Cache-Control:No-cache, Must-revalidate");


// khai báo biến dùng để chứa chuỗi mã số
$new_string = "";

// khởi tạo kích thước hình ảnh
$image_width = 61;
$image_height = 31;
$im = ImageCreate($image_width, $image_height);

// khởi tạo các chổi màu cần thiết
$white = ImageColorAllocate($im, 255, 255, 255);
$black = ImageColorAllocate($im, 0, 0, 0);
$gray = ImageColorAllocate($im, 192, 192, 192);


// khởi tạo nhân dùng để sinh số ngẫu nhiên
srand((double)microtime()*1000000);

//tạo một dãy chữ và số bằng cách dùng hàm MD5 để mã hóa một số ngẫu nhiên
$string = md5(rand(0,9999));

// sinh mã mới
$new_string = strtoupper(substr($string, 17, 5));

//khởi tạo session, lưu mã được sinh ra vào session, mã này sẽ được dùng để
// kiểm tra tính hợp lệ
session_start();
$_SESSION['verification_code'] = $new_string;

//tô hình với màu nền trắng
ImageFill($im, 0, 0, $white);

//vẽ các đường dọc và ngang
$i =0;
for (
$i=0; $i <= $image_height; $i = $i + 10)
ImageLine($im, 0, $i, $image_width, $i, $gray);
for (
$i=0; $i <= $image_width; $i = $i + 10)
ImageLine($im, $i, 0, $i, $image_height, $gray);


//vẽ chuỗi số
ImageString($im, 5, 8, 8, $new_string, $black);

//xuất hình ra browser
ImageJPEG($im);
ImageDestroy($im);
?>

Trong đoạn code trên, phần lớn code dùng để vẽ hình, và do code được chú thích đầy đủ nên bạn có thể dễ dàng hiểu được nó làm gì. Điều duy nhất bạn cần quan tâm là dòng code:

$_SESSION['verification_code'] = $new_string;

Dòng này lưu mã đã được sinh ra vào biến session là verification_code, biến này sẽ được dùng để kiểm tra tính hợp lệ sau này. Sau khi đã biết cách sinh một hình ảnh ngẫu nhiên, chúng ta tiến hành ứng dụng vào code của mình. Để sử dụng chức năng này trong form đăng ký của bạn, bạn hãy thêm ít nhất các mã HTML vào form đăng ký của mình:

<img src="verify.php?rand=" border="0">
<input type="text" name="verify_code" size="20" maxlength="20">

và trong file script xử lý form, bạn chỉ cần thêm đoạn code đơn giản sau để kiểm tra

session_start(); //bỏ dòng này nếu bạn đã gọi ở trên
$new_string = $_SESSION['verification_code'];


if ($new_string != $_POST['verify_code']) // mã nhập không đúng
{
//bạn thêm đoạn mã xử lý lỗi ở đây vì người sử dụng nhập mã không hợp lệ
//...

}

Với 3 bước đơn giản trên, bạn đã thêm được chức năng kiểm tra bằng hình ảnh vào form đăng ký của mình để chống bị flood. Chúc các bạn thành công!

C

Pix of 12L

Hôm tối, ngồi buồn lấy album hồi 12 ra coi, dzui quá chừng. Vừa đọc nhật kí lấy từ chú Bá, vừa coi hình, đọc say sưa đến hết cuốn nhật ký dày cộm lúc nào không hay :-).Tuy cũng mất nhiều rồi nhưng nói chung coi lại vẫn thấy nhớ hồi trước nên tranh thủ scan mấy cái hình để lưu trên mạng, cũng như post lên forum lvcfc.com và blog này.

Bi giờ post mấy cái hình vui vui ở đây thui, sau này kiếm thêm chú Ny hay Hiếu cọ sẽ có nhiều hình hấp dẫn nữa