PHP – Tạo captcha đơn giản

PHP Simple captchaKhi tìm hiểu về phần Image Processing and GD, tôi nhận thấy việc tạo một ứng ụng captcha từ những phương thức của PHP rất đơn giản. Trong bài  viết này, tôi chỉ vận dụng một số hàm cơ bản để tạo nên captcha cùng với cách hoạt động của nó.

Tạo chuỗi captcha

Việc đầu tiên là phải được nội dung captcha ngẫu nhiên, sử dụng rand() để tạo ra từng kí tự à? Không cần thiết, bởi vì PHP cung cấp hàm md5() để tạo ra mã hash cho chuỗi. Ta sẽ tạo ra một chuỗi ngẫu nhiên bằng cách dùng dùng hàm md5() với tham số là một giá trị lấy từ hàm rand().

Ngoài ra, việc tạo chuỗi captcha này còn cho phép xác định độ dài chuỗi bằng cách truyền query string (tôi đặt tên tham số này là “len”), giá trị mặc định của độ dài chuỗi là 5:

$length=5;
if(isset($_GET["len"]))
	$length=$_GET["len"];$md5 = md5(rand());
$text = substr($md5,0,$length);

Tạo captcha từ ảnh nền có sẵn

Tôi sẽ tạo một đối tượng ảnh từ tập tin captcha.png có sẵn với hàm imagecreatefrompng(). Lưu ý rằng tập tin captcha.png này chỉ là ảnh nền. Sau đó sẽ dùng hàm như imageline() để “trang điểm” thêm cho ảnh nền bằng các đường thẳng ngẫu nhiên, và cuối cùng là hàm imagestring() để vẽ văn bản lên ảnh.

Để captcha được cân đối, tôi bổ sung phần tính toán vị trí của văn bản sẽ vẽ từ các thông tin về kích thước của ảnh và font.

$captcha = imagecreatefrompng("images/captcha.png");
$font=4;
for($i=0;$i<20;$i++)
	imageline ( $captcha , rand(0,100) , rand(0,100) , rand(0,100),rand(0,100),rand(0,100000));
$image_width=imagesx($captcha);
$image_height=imagesy($captcha);
$text_width=imagefontwidth($font)*$length;
$text_height=imagefontheight($font);
imagestring($captcha, $font, ($image_width-$text_width)/2 , ($image_height-$text_height)/2, $text, 0);

Xuất captcha

Trước khi làm điều này, tôi sẽ lưu lại mã để nhận diện captcha vào trong session. Để đảm bảo an toàn, tôi sẽ mã hóa md5 lần nữa cho nội dung captcha.

Khi trang web này được truy xuất đến, tôi xác định rằng nó sẽ trả về một luồng dữ liệu dạng image/png bằng cách đặt header cho nó với hàm header(), sau đó chỉ việc xuất ảnh ra với hàm imagepng(). Tức là thay vì trả về cho trình duyệt là nội dung html như thông thường, trang này sẽ trả về một hình ảnh với định dạng png. Hãy thử truy xuất tới tập tin này khi bạn làm ví dụ để thấy rõ điều này.

$_SESSION['captcha'] = md5($text);

header("Content-type: image/png");
imagepng($captcha);
imagedestroy($captcha);

$_SESSION[‘captcha’] = md5($text);

Mã nguồn hoàn chỉnh

PHP Simple captcha

genCaptcha.php:

<?php
	$length=5;
	if(isset($_GET["len"]))
		$length=$_GET["len"];

		session_start();

	$md5 = md5(rand());

	$text = substr($md5,0,$length);
	$captcha = imagecreatefrompng("images/captcha.png");

	$font=4;

	for($i=0;$i<20;$i++)
		imageline ( $captcha , rand(0,100) , rand(0,100) , rand(0,100),rand(0,100),rand(0,100000));

	$image_width=imagesx($captcha);
	$image_height=imagesy($captcha);

	$text_width=imagefontwidth($font)*$length;
	$text_height=imagefontheight($font);

	imagestring($captcha, $font, ($image_width-$text_width)/2 , ($image_height-$text_height)/2, $text, 0);

	$_SESSION['captcha'] = md5($text);

	header("Content-type: image/png");
	imagepng($captcha);
	imagedestroy($captcha);

test.php:

<html>
</html>
<head>
<script type="text/javascript">
function changeCaptcha()
{
	document.getElementById("captchaImage").src="genCaptcha.php?len="+(Math.random()*4+4);
}
</script>

</head>
<body>
<img id="captchaImage" src="genCaptcha.php" width="150px" height="50px"></image>
<br/>
<button id="newCaptcha" onclick="changeCaptcha()">new captcha</button>
</body>

Bạn có thể thấy bằng cách thay đổi thuộc tính src của thẻ <img>, trang web của chúng ta làm việc tương tự như ajax mặc dù không sử dụng bất kì phương thức ajax nào.

https://yinyangit.wordpress.com

Advertisements

2 thoughts on “PHP – Tạo captcha đơn giản

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s