This is a widely used captcha implementation. It’s used at big sites like Facebook and CraigsList.
Steps to Use
1. Sign up for an access key at http://recaptcha.net/
2. Get recaptchalib.php from the zip archive located at http://code.google.com/p/recaptcha/downloads/list?q=label:phplib-Latest.
3. Rename recaptchalib.php to recaptcha_helper.php and put it in your helpers folder.
4. Add the following function to recaptcha_helper.php:
function recaptcha()
{
$CI =& get_instance();
$CI->config->load('recaptcha');
$public_key = $CI->config->item('recaptcha_public_key');
$message = isset($CI->validation->recaptcha_error)
? $CI->validation->recaptcha_error : '';
return recaptcha_get_html($public_key, $message);
}
4. Add the following function to your MY_Validation class as seen below in the libraries folder. (If you don’t already have one a MY_Validation class, make one.)
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Validation extends CI_Validation
{
function MY_Validation()
{
parent::CI_Validation();
}
function recaptcha_matches()
{
$CI =& get_instance();
$CI->config->load('recaptcha');
$public_key = $CI->config->item('recaptcha_public_key');
$private_key = $CI->config->item('recaptcha_private_key');
$response_field = $CI->input->post('recaptcha_response_field');
$challenge_field = $CI->input->post('recaptcha_challenge_field');
$response = recaptcha_check_answer($private_key,
$_SERVER['REMOTE_ADDR'],
$challenge_field,
$response_field);
if ($response->is_valid)
{
return TRUE;
}
else
{
$CI->validation->recaptcha_error = $response->error;
$CI->validation->set_message('recaptcha_matches', 'The %s is incorrect. Please try again.');
return FALSE;
}
}
}
5. Create a recaptcha.php in your config folder and add your public and private keys (the ones you got from registering) as seen below:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$config['recaptcha_public_key'] = "...";
$config['recaptcha_private_key'] = "...";
Example usage in a controller:
public function register()
{
$this->load->library('validation');
$this->load->helper('recaptcha');
$rules['username'] = 'trim|required|unique[users.username]';
$rules['password'] = 'required|password|matches[password_confirm]';
$rules['password_confirm'] = 'required';
$rules['email'] = 'trim|required|valid_email|unique[users.email]';
$rules['recaptcha_challenge_field'] = 'required|recaptcha_matches';
$this->validation->set_rules($rules);
$fields['username'] = 'username';
$fields['password'] = 'password';
$fields['password_confirm'] = 'password confirmation';
$fields['email'] = 'email';
$fields['recaptcha_challenge_field'] = 'answer to the security question';
$this->validation->set_fields($fields);
if ($this->validation->run() == FALSE)
{
$this->load->view('user_registration');
}
else
{
echo 'Success!';
}
}
In the view, you can create the captcha form element by echoing <?= recaptcha() ?>
I can package all of this into a zip file upon request.