CodeIgniter Forums

Full Version: reCAPTCHA helper and validation function (easy-to-use captcha)
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3

El Forum

[eluser]vendiddy[/eluser]
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/downl...lib-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:
Code:
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.)
Code:
<?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:
Code:
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$config['recaptcha_public_key'] = "...";
$config['recaptcha_private_key'] = "...";

Example usage in a controller:
Code:
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.

El Forum

[eluser]bijon[/eluser]
Thanks a lot. Very cool. You can send me the zip in this email [email protected] Also i want to publish this things in my blog with refer you.

Keep up this good work.

El Forum

[eluser]Berserk[/eluser]
hi, i got this problem

Code:
This reCAPTCHA key isn't authorized for the given domain. More info

Do you know why and how to fix? I think it's because reCAPTCHA system :-?

Note: i used public and private key both for subdomain and domain.

El Forum

[eluser]vendiddy[/eluser]
[quote author="Berserk" date="1225278450"]hi, i got this problem

Code:
This reCAPTCHA key isn't authorized for the given domain. More info

Do you know why and how to fix? I think it's because reCAPTCHA system :-?

Note: i used public and private key both for subdomain and domain.[/quote]

Have you been able to fix the problem? I'm not sure what the issue is.

Try to make sure your domain name matches and that you entered in your public / private keys in correctly into the config file.

El Forum

[eluser]Berserk[/eluser]
thanks, i tried with other domain and it works ! But look like their problem with subdomain.

El Forum

[eluser]PermanaJ[/eluser]
this is what i'm looking for. Would you like to send me the zip file ? I'm a little bit confuse with the validation, form_validation, and the view .. so i need to look the whole file ... ohh, almost forgot .. you can send to [email protected]

El Forum

[eluser]vendiddy[/eluser]
Hi PermanaJ, I wrote this helper for version 1.6 of CI. The current version of CI is now 1.7 which uses form_validation instead of validation.

Someone else modified it to work with version 1.7 and posted it here: http://ellislab.com/forums/viewthread/96365/

Good luck!

El Forum

[eluser]PermanaJ[/eluser]
Ohh .. im using 1.7 .. thank a lot for the information ...

but the code above work well with 1.7

El Forum

[eluser]Unknown[/eluser]
Hi,
I am not a website admin, I am just trying to post a comment into a site that uses Capcha.
The Capcha works for everyone else, i.e. they can see an image and a field to enter what they see and are able to click sumbit, but not for me.

Instead, I get the same message "This reCAPTCHA key isn't authorized for the given domain. More info"

I read the replies but don't understand the cause of the problem, as I'm not very capcha savvy.. Sad

can anyone help?

thank you Smile

El Forum

[eluser]Tobz[/eluser]
I've made changes to make this work in CI 1.7.x

First, rename MY_Validation.php to MY_Form_validation.php

then change the code to match this:
Code:
<?php
if (!defined('BASEPATH')) exit ('No direct script access allowed');

class MY_Form_validation extends CI_Form_validation {

  function MY_Form_validation() {
    parent::CI_Form_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 {
      $this->recaptcha_error = $response->error;
      $this->set_message('recaptcha_matches', 'The %s is incorrect. Please try again.');
      return FALSE;
    }
  }

}

and thats it.
Your recapture should now work with the current form validation class.
Pages: 1 2 3