Sử dụng Captcha helper trên CodeIgniter

Biện pháp chống spam thường thấy ở các website là sử dụng Captcha. Thông thường bạn sẽ phải sử dụng hàng loạt hàm, mã,... để tạo ảnh captcha. Đối với CodeIgniter thì các thao tác của bạn chỉ đơn giản là cấu hình, khai báo và sử dụng..

Bài viết hướng dẫn sử dụng Captcha helper trong CodeIgniter.

Các công cụ cần thiết.

Như ta đã biết CAPTCHA là một hình ảnh chứa các ký tự ngẫu nhiên. Trên form submit thông tin của một website thường được đi kèm bằng hình ảnh CAPTCHA này. Khi người dùng submit form thì phải nhập đúng giá trị xuất hiện trong hình ảnh này. Chức năng này để nhận biết user này là con người chứ không phải Robot.

Sử dụng Captcha helper trên CodeIgniter

Các bước thực hiện chương trình sẽ như bên dưới.

1. Tải Captcha helper.

Để tải được helper này thì ta dùng hàm load().

$this->load->helper('captcha');

2. Tạo module catcha.

Trong thư mục modules, ta sẽ tạo một module tên là captcha theo cấu trúc thư mục như sau.

Sử dụng Captcha helper trên CodeIgniter

Trong thư mục controllers chúng ta sẽ tạo một file tên là captcha.php, và chép đoạn mã sau đây vào.

<?php 

class Captcha extends	CI_Controller
{
	public function __construct()
	{
		parent::__construct();
		$this->load->helper(array('captcha'));
	}
	
	
	public function index()
	{
		$vals = array(
			    'img_path'	 => APPPATH.'../uploads/captcha/images/',
			    'img_url'	 => 'http://thuthuatvietnam.com.local/uploads/captcha/images/',
			    'font_path'	 => APPPATH.'../uploads/captcha/fonts/texb.ttf',
			    'img_width'	 => '170',
			    'img_height' => '45',
			    'expiration' => 7200
		    );
		$cap = create_captcha($vals);
		$data = array(
				    'captcha_time'	=> $cap['time'],
				    'ip_address'	=> $this->input->ip_address(),
				    'word'	 => $cap['word']
    			);
		$this->load->model('captcha_model');
		$b_SaveData = $this->captcha_model->saveData($data);
		if($_SERVER['REQUEST_METHOD'] == 'POST')
		{
			$sz_Word = $this->input->post('captcha');
			$b_Check = $this->captcha_model->b_fCheck($sz_Word);
			if($b_Check)
			{
			$a_Data['success'] = 'Your input catpcha is correct';
			}else{
			$a_Data['error'] = 'Your input catpcha is not correct. Please try again.';
			}
		}	
		
		$a_Data['Data'] = $cap['image'];
		$this->load->view('captcha_template', $a_Data);
	}
}
  • Hàm captcha yêu cầu phải sử dụng thư viện ảnh GD
  • Hàm này cần có hai tham số bắt buộc là img_path và img_url
  • Nếu tham số "word" không được truyền vào, thì hàm sẽ tạo ra một chuỗi ký tự mã ASCII ngẫu nhiên
  • Nếu không chỉ rõ đường dẫn tới font, thì mặc định sẽ lấy từ thư viện GD ra.
  • Thư mục 'captcha/images' phải có quyền được ghi, để ảnh tạo ra được lưu vào trong thư mục này.
  • Tham số 'expiration' (tính theo giây) định nghĩa thời gian tồn tại của bức ảnh CAPTCHA này trước khi bị xóa khỏi thư mục. Mặc định là 2 tiếng.

Sử dụng Captcha helper trên CodeIgniter

Trong thư mục models các bạn tạo một file tên là captcha_model.php, với nội dung là

<?php 

class Captcha_model extends CI_Model
{
	private $_name = 'ci_captcha';
	
	function __construct(){
		parent::__construct();
	}
	
	public function saveData($the_a_Data)
	{
		$query = $this->db->insert_string($this->_name, $the_a_Data);
		return $this->db->query($query);
	}
	
	public function b_fCheck($the_sz_Captcha)
	{
	// Xóa các captch cũ đi
	$expiration = time()-7200; // Giới hạn là 2 tiếng
	$this->db->query("DELETE FROM $this->_name WHERE captcha_time < ".$expiration);
		
	// Kiểm tra captcha nhập vào có tồn tại hay không:
	$sql = "SELECT COUNT(*) AS count FROM $this->_name WHERE word = ? AND ip_address = ? AND captcha_time > ?";
	$binds = array($the_sz_Captcha, $this->input->ip_address(), $expiration);
	$query = $this->db->query($sql, $binds);
	$row = $query->row();
		
	if ($row->count == 0)
	{
		return false;
	}
	else 
	{
		return true;
	}
	}
}

Trong thư mục views các bạn tạo một file tên là captcha_template.php, với nội dung là

<!DOCTYPE html>
<html lang="en">
<head>
	<style type="text/css">
		#body{margin:10px auto; width: 800px; font-size: 90%; }
		form {width: 600px; margin: 40 auto;}
		form div{padding: 0 0 5px 0;}
		label {width: 120px; display: block; float: left; clear: left; font-weight: bold;}
		span.error {width: auto; padding: 0 0 0 120px; font-style: italic; color: red; font-size: 90%;}
		span.success {width: auto; padding: 0 0 0 120px; font-style: italic; color: green; font-size: 90%;}
		.form{ width: 150px;}
	</style>
	<meta charset="utf-8">
	<title>Thủ thuật Việt Nam | Sử dụng Captcha helper trên CodeIgniter</title>
</head>
<body>
	<div id="body">
		<h2>Sử dụng Captcha helper trên CodeIgniter</h2>
		<form action="<?php echo base_url()."captcha/index/" ?>" method="post" id="form">
		<fieldset>
		<legend>Sử dụng Captcha helper trên CodeIgniter</legend>
		<div>
		<?php if(isset($success)){ echo "<span class='success'> $success </span>"; } elseif (isset($error)){echo "<span class='error'> $error </span>";}?>
		</div>
		<div>
			<label for="username">Submit the word you see below:</label>
			<span><?php echo $Data; ?></span><br />
			<input class="form" type="text" name="captcha" value="" size="50" />
		</div>
		<div><input type="submit" id="save" value="Save changes" /></div>
		</fieldset>
		</form>
	</div>
</body>
</html>

3. Tạo Database cho chương trình.

Để xử lý dữ liệu về mã Captcha, chúng ta cần một Database để lưu lại và quản lý những giá trị captcha được sinh ra.

Các bạn truy cập vào trình quản lý Database là PHPMyAdmin theo đường dẫn http://localhost/phpmyadmin/

Sau đó chọn Database tên là test. Database này là do ta thiết lập trong file database.php ở thư mục config.

Tiếp theo chọn tab SQL để tạo Database cần thiết. Sau đó các bạn copy đoạn mã sau vào cửa sổ của SQL tab ra click GO.

CREATE TABLE captcha (
 captcha_id bigint(13) unsigned NOT NULL auto_increment,
 captcha_time int(10) unsigned NOT NULL,
 ip_address varchar(16) default '0' NOT NULL,
 word varchar(20) NOT NULL,
 PRIMARY KEY `captcha_id` (`captcha_id`),
 KEY `word` (`word`)
);

Sử dụng Captcha helper trên CodeIgniter


4. Kiểm tra chương trình.

Các bạn truy cập vào link sau để kiểm tra kết quả trên trình duyệt.

http://localhost/ci-test/captcha/

Và sản phẩm sẽ như hình bên dưới

Sử dụng Captcha helper trên CodeIgniter

Chúc các bạn thành công :)

Tags: