Lập trình PHP - Bài 15: Viết ứng dụng tạo mã xác nhận bằng PHP

Ở những bài trước, chúng ta đã tìm hiểu về cách làm việc với PHP kết hợp MYSQL trong việc

xây dựng hệ thống thêm, sửa, xóa và quản lý user. Trong bài này, chúng ta tiếp tục tìm hiểu

phương pháp tạo dãy số ngẫu nhiên để chống tấn công flood dữ liệu. Hoặc ai đó cố tình spam

khiến cơ sở dữ liệu của chúng ta không thể xử lý tiếp được.

pdf4 trang | Chuyên mục: PHP | Chia sẻ: dkS00TYs | Lượt xem: 1941 | Lượt tải: 2download
Tóm tắt nội dung Lập trình PHP - Bài 15: Viết ứng dụng tạo mã xác nhận bằng PHP, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
Bài 15: Viết ứng dụng tạo mã xác nhận bằng PHP 
Ở những bài trước, chúng ta đã tìm hiểu về cách làm việc với PHP kết hợp MYSQL trong việc 
xây dựng hệ thống thêm, sửa, xóa và quản lý user. Trong bài này, chúng ta tiếp tục tìm hiểu 
phương pháp tạo dãy số ngẫu nhiên để chống tấn công flood dữ liệu. Hoặc ai đó cố tình spam 
khiến cơ sở dữ liệu của chúng ta không thể xử lý tiếp được. 
Trước tiên, chúng ta tiến hành tạo form HTML đơn giản để thực thi thao tác nhập liệu như sau: 
 Captcha 
   
Chúng ta chú ý phần hình ảnh, tại đây tôi truyền đường dẫn chính là liên kết tới trang 
random_image.php. Trang này sẽ thực thi công việc tạo ra những bức hình có dãy số ngẫu nhiên 
để phần nhập liệu của người sử dụng tham chiếu tới. 
Tiếp theo, chúng ta khởi tạo file random_image.php để lấy ra dãy số ngẫu nhiên và phát sinh 
chúng ngay trên tấm hình cho người truy cập nhập liệu. 
Để làm được điều đó. Chúng ta sẽ khởi tạo session và lưu dãy số nhập liệu đó vào session của 
mình, sau đó so khớp với trang form bên kia.(xem lại Bài 7: Khái niệm cơ bản về cookie và 
session trong PHP) 
Đầu tiên chúng ta sử dụng hàm md5 và ran để mã hóa các ký tự bao gồm số và chữ cái. Khi sử 
dụng hàm md5() ký tự phát sinh sẽ lên tới 32 ký tự. Và chúng ta chỉ lấy duy nhất 5 ký tự từ chuỗi 
mã hóa đó bằng hàm substr. Tiếp tục ta lưu đoạn mã hóa này trong session cụ thể 
$_SESSION['security_code'], để tại trang form ta sẽ sử dụng so sánh với phần nhập liệu của 
người sử dụng. 
Vậy nên đoạn code dưới sẽ giải quyết các tình huống này. 
<?php 
$md5_hash = md5(rand(0,999)); 
$security_code = substr($md5_hash, 15, 5); 
$_SESSION["security_code"] = $security_code; 
?> 
Kế đến ta khởi tạo tấm hình với chiều rộng và chiều cao mà ta thiết lập thông qua hàm 
ImageCreate() . Và tiếp tục khai báo 2 màu chính là trắng và đen bằng hàm 
ImageColorAllocate($image, red, green, blue ). Hàm này sẽ tạo ra một màu sắc từ hệ màu RGB 
trên tấm hình mà chúng ta vừa khởi tạo. 
Tiếp tục ta đổ background của tấm hình sẽ là màu đen và chữ xuất hiện trên tấm hình sẽ là màu 
trắng bằng hàm ImageFill() và hàm ImageString(). Hàm ImageString có một số đối số cơ bản 
như sau: ImageString($image, 5, 30, 6, $security_code, $white); Trong đó: 
+ $image là hình mà chúng ta khởi tạo. 
+ 5: là font-size mà chúng ta quy ước cho ký tự xuất hiện trên hình. 
+ 30: là khoảng cách bên trái của tấm hình. 
+ 6 : là khoảng cách từ trên của tấm hình. 
+ $security_code: là đoạn code sau khi chúng ta cắt ra ở trên. 
+ $white: là màu sắc mà chúng ta đã sử dụng hàm ImageColorAllocate() ở trên để khởi tạo ra 
màu trắng. 
<?php 
$width = 100; 
$height = 30; 
$image = ImageCreate($width, $height); 
$white = ImageColorAllocate($image, 255, 255, 255); 
$black = ImageColorAllocate($image, 0, 0, 0); 
ImageFill($image, 0, 0, $black); 
ImageString($image, 5, 30, 6, $security_code, $white); 
?> 
Kế tới chúng ta sẽ sử dụng lệnh header để trả nội dung này trở về dữ liệu dạng hình. Và tiến hành 
khởi tạo định dạng cho file hình mà chúng ta vừa tạo là JPG đồng thời giải phóng hình tạm được 
sử dụng để khợi tạo ra tấm hình này bằng đoạn code sau: 
<?php 
header("Content-Type: image/jpeg"); 
ImageJpeg($image); 
ImageDestroy($image); 
?> 
Để dễ quản lý chúng ta sẽ đặt tất cả đoạn code trên vào trong 1 hàm để dễ sử dụng và quản lý 
chúng tốt hơn. Vậy toàn bộ đoạn code trong trang random_image.php này như sau. 
<?php 
session_start(); 
function create_image() 
{ 
 $md5_hash = md5(rand(0,999)); 
 $security_code = substr($md5_hash, 15, 5); 
 $_SESSION["security_code"] = $security_code; 
 $width = 100; 
 $height = 30; 
 $image = ImageCreate($width, $height); 
 $white = ImageColorAllocate($image, 255, 255, 255); 
 $black = ImageColorAllocate($image, 0, 0, 0); 
 ImageFill($image, 0, 0, $black); 
 ImageString($image, 5, 30, 6, $security_code, $white); 
 header("Content-Type: image/jpeg"); 
 ImageJpeg($image); 
 ImageDestroy($image); 
} 
create_image() ; 
exit(); 
?> 
Tiếp tục, trong trang form chúng ta phải khởi tạo session để chúng nhận được các giá trị mà ta đã 
khởi tạo và sử dụng ở trang random_image, kế tới ta kiểm tra xem người dùng có nhấn submit 
chưa. Nếu có ta sẽ tiếp tục kiểm tra xem người dùng nhập vào textbox có đúng là dãy số hiển thị 
trên hình ảnh hay không. Và xuất ra thông báo tương ứng với nội dung của người nhập liệu. 
(xem lại Bài 4: Xử lý giá trị form trong PHP) 
Sau đây là toàn bộ code của trang form.php. 
<?php 
session_start(); 
if(isset($_POST['ok'])) 
{ 
 if($_POST['txtCaptcha'] == NULL) 
 { 
 echo "Please enter your code"; 
 } 
 else 
 { 
 if($_POST['txtCaptcha'] == $_SESSION['security_code']) 
 { 
 echo "ma lenh hop le"; 
 } 
 else 
 { 
 echo "Ma lenh khong hop le"; 
 } 
 } 
} 
?> 
 Captcha 
   
Download toàn bộ source code này tại đây. 
Tổng kết: 
 Qua bài học này, chúng ta đã hiệu được nguyên tắc xử lý và những hàm cơ bản mà 1 hệ thống 
khi sử dụng captcha cần phải vận dụng như thế nào. Và tất nhiên hàm xử lý captcha này cũng chỉ 
mang kiến trúc tương đối. Để tăng cường tính bảo mật hơn, các bạn nên sử dụng 1 số hàm 
chuyên dụng nhằm mã hóa hoặc gây nội dung khó nhìn hơn để chặn các tools hoặc các hệ thống 
bot có thể qua mặt thông số này. 

File đính kèm:

  • pdf15.pdf
Tài liệu liên quan