Hướng dẫn tạo captcha đơn giản trong PHP

Hướng dẫn tạo captcha đơn giản trong PHP

Khi 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

Hướng dẫn tạo captcha đơn giản trong PHP

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);
</pre-->
<p> </p>
<p>test.php:</p>
<p> </p>
<pre class="brush: xml;">
 
 
<script type=""text/javascript"">
function changeCaptcha()
{
document.getElementById("captchaImage").src="genCaptcha.php?len="+(Math.random()*4+4);
}
</script>
 
 
<img id=""captchaImage"" src=""genCaptcha.php"" height=""50px"" width=""150px"">
<br>
<button id=""newCaptcha"" onclick=""changeCaptcha()"">new captcha</button>
 
</pre>
<p> </p>
<p>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.</p>
Bạn thấy bài viết này như thế nào?: 
Average: 7.3 (7 votes)
Ảnh của Khanh Hoang

Khanh Hoang - Kenn

Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.

Advertisement

 

jobsora

Dich vu khu trung tphcm

Dich vu diet chuot tphcm

Dich vu diet con trung

Quảng Cáo Bài Viết

 
Tay vợt xinh đẹp 26 tuổi Eugenie Bouchard người Canada nhận hàng triệu email

Tay vợt xinh đẹp 26 tuổi Eugenie Bouchard người Canada nhận hàng triệu email

Tay vợt xinh đẹp 26 tuổi người Canada Eugenie Bouchard đã nhận hàng triệu email xin làm bạn trai chỉ vài ngày sau khi đăng tải một dòng tâm trạng trên trang cá nhân của mình.

Ultrabook đầu tiên có ổ đĩa quang

Ultrabook đầu tiên có ổ đĩa quang

Máy tính xách tay Samsung Series 5 cỡ 14 inch tích hợp ổ DVD và card đồ họa rời của AMD giúp chạy mượt những game 3D mới nhất.

Google Adsense, Google

Hướng dẫn đặt code Google Adsense vào website

Sau khi đã đăng ký thành công Google Adsense và chính thức trở thành Adsense Client, Webmaster sẽ tiến hành đặt code quảng cáo vào website của mình. Trước tiên phải đăng nhập vào Google Adsense home page.

Công ty diệt chuột T&C

 

Diet con trung