Using the following guide online (and the 1.7x fix at the bottom) http://codeigniter.com/forums/viewthread/94299/
Recaptcha validation works well when working locally (tested on both my windows machine and a friends OSX machine) however when uploaded too both my server and his web host the validation routine for the recaptch appears not get checked even though the other validation on the pages do. However no errors are thrown and I have looked through the code and unable to find out what is going wrong. If anyone could help me find out what is going on it would be greatly appreciated.
here are the classes that deal with this
application/libraries/MY_Form_Validation.php
<?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->err开发者_JAVA技巧or;
$this->set_message('recaptcha_matches', 'The %s is incorrect. Please try again.');
return FALSE;
}
}
application/helpers/recaptcha_helper.php
http://pastebin.com/m352494c3
application/controllers/forum.php - post thread method
public function add_thread($category_id = null)
{
$category = $this->forums->get_category($category_id);
if ($category == false)
{
$this->template->set('title', 'Invalid Page');
$data['error_message'] = "Invalid category to add thread too";
$this->template->load('template', 'error', $data);
return;
}
$user = $this->users->get($this->session->userdata('user_id'));
$data['category_id'] = $category['id'];
$data['category_title'] = $category['category_title'];
$data['loggedin'] = $this->session->userdata('loggedin');
$this->form_validation->set_rules('thread_title', 'Title', 'required');
$this->form_validation->set_rules('thread_body', 'Body', 'required');
if (!$data['loggedin'])
{
$this->form_validation->set_rules('recaptcha_challenge_field', 'answer to the security question', 'recaptcha_matches');
}
if ($this->form_validation->run() == FALSE)
{
$this->template->load('template', 'forums/add_thread', $data);
return;
}
$thread['thread_title'] = $this->input->post('thread_title');
$thread['thread_body'] = $this->input->post('thread_body');
if($user==false){
$thread['user_id'] = -1;
}else{
$thread['user_id'] = $user->id;
}
$thread['posted_date'] = date("Y-m-d H:i:s");
$thread['category_id'] = $category_id;
$this->forums->add_thread($thread);
redirect('forums/view/' . $category_id, 'refresh');
}
In my code, I usually write it like this:
$response = recaptcha_check_answer($private_key, $CI->input->ip_address(), $challenge_field, $response_field);
$CI->input->ip_address()
have more sophisticated way to detect client IP Address. than using REMOTE_ADDR
alone.
Also, make sure that you have both private and public key matched the server's domain name, or use global key.
精彩评论