2012-06-08 61 views
0

的Recaptcha響應空我試圖用的Recaptcha我的一種形式整合。我以某種方式設法將recaptcha放在窗體上並使用Curl提交(在這篇文章的幫助下:What is blocking fsockopen?)。 但是,即使是正確的答案,recaptcha似乎也不接受。爲有效的答案

我不擅於PHP,但在調試的代碼(offcourse使用echo),發現該響應就要爲空。我已經花了2天時間,但仍然無濟於事。

我是否需要包括捲曲後作出recaptcha_check_answer什麼變化?

注:我使用WAMPServer 2.2(阿帕奇:2.2.21,PHP:5.3.10)

下面是我的表單代碼的摘錄,並提交代碼。

/** Recaptcha display Code**/ 
require_once('recaptchalib.php'); 
$publickey = "6LeamtESAAAAAH-77WMLP5NqvCQR8g3ZMJ7kZJvV"; // you got this from recaptcha.org 

$out = '<div><label for="captcha'.$form_id.'">* '.$field_object->field_label.'</label></div>'; 
$out .= recaptcha_get_html($publickey); 
return $out; 


/** Form Submit Code **/ 
require_once('recaptchalib.php'); 
$privatekey = "6LeamtESAAAAAFM1d1Zd2XRDlTjxZRH8OaTowg7n"; 

$resp = recaptcha_check_answer($privatekey, 
     $_SERVER["REMOTE_ADDR"], 
     $_POST["recaptcha_challenge_field"], 
      $_POST["recaptcha_response_field"]); 

if (!$resp->is_valid) { 
    if (empty($resp->error)) 
     $this->setFormError('captcha', __('You copied the number from the captcha field incorrectly.', 'custom-contact-forms')); 
    else $this->setFormError('captcha', $resp->error); 
} 

下面是修改的驗證碼代碼

<?php 

define("RECAPTCHA_API_SERVER", "http://www.google.com/recaptcha/api"); 
define("RECAPTCHA_API_SECURE_SERVER", "https://www.google.com/recaptcha/api"); 
define("RECAPTCHA_VERIFY_SERVER", "www.google.com"); 

function _recaptcha_qsencode ($data) { 
     $req = ""; 
     foreach ($data as $key => $value) 
       $req .= $key . '=' . urlencode(stripslashes($value)) . '&'; 

     // Cut the last '&' 
     $req=substr($req,0,strlen($req)-1); 
     return $req; 
} 

function _recaptcha_http_post($host, $path, $data, $port = 80) { 

     $req = _recaptcha_qsencode ($data); 
     $request = curl_init("http://".$host.$path); 

     curl_setopt($request, CURLOPT_USERAGENT, "reCAPTCHA/PHP"); 
     curl_setopt($request, CURLOPT_POST, true); 
     curl_setopt($request, CURLOPT_POSTFIELDS, $req); 
     curl_setopt($request, CURLOPT_RETURNTRANSFER, true); 

     $response = curl_exec($request); 
     return $response; 
} 

function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false) 
{ 
    if ($pubkey == null || $pubkey == '') { 
     die ("To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>"); 
    } 

    if ($use_ssl) { 
       $server = RECAPTCHA_API_SECURE_SERVER; 
     } else { 
       $server = RECAPTCHA_API_SERVER; 
     } 

     $errorpart = ""; 
     if ($error) { 
      $errorpart = "&amp;error=" . $error; 
     } 
     return '<script type="text/javascript" src="'. $server . '/challenge?k=' . $pubkey . $errorpart . '"></script> 

    <noscript> 
     <iframe src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/> 
     <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea> 
     <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/> 
    </noscript>'; 
} 

class ReCaptchaResponse { 
     var $is_valid; 
     var $error; 
} 

function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) 
{ 
    if ($privkey == null || $privkey == '') { 
     die ("To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>"); 
    } 
    if ($remoteip == null || $remoteip == '') { 
     die ("For security reasons, you must pass the remote ip to reCAPTCHA"); 
    } 

     //discard spam submissions 
     if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { 
       $recaptcha_response = new ReCaptchaResponse(); 
       $recaptcha_response->is_valid = false; 
       $recaptcha_response->error = 'incorrect-captcha-sol'; 
       return $recaptcha_response; 
     } 

     $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/verify", 
              array (
               'privatekey' => $privkey, 
               'remoteip' => $remoteip, 
               'challenge' => $challenge, 
               'response' => $response 
               ) + $extra_params 
             ); 

     $answers = explode ("\n", $response [1]); 
     $recaptcha_response = new ReCaptchaResponse(); 

     if (trim ($answers [0]) == 'true') { 
       $recaptcha_response->is_valid = true; 
     } 
     else { 
       $recaptcha_response->is_valid = false; 
       $recaptcha_response->error = $answers [1]; 
     } 
     return $recaptcha_response; 
} 

function recaptcha_get_signup_url ($domain = null, $appname = null) { 
    return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname)); 
} 

function _recaptcha_aes_pad($val) { 
    $block_size = 16; 
    $numpad = $block_size - (strlen ($val) % $block_size); 
    return str_pad($val, strlen ($val) + $numpad, chr($numpad)); 
} 

/* Mailhide related code */ 

function _recaptcha_aes_encrypt($val,$ky) { 
    if (! function_exists ("mcrypt_encrypt")) { 
     die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); 
    } 
    $mode=MCRYPT_MODE_CBC; 
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=_recaptcha_aes_pad($val); 
    return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); 
} 


function _recaptcha_mailhide_urlbase64 ($x) { 
    return strtr(base64_encode ($x), '+/', '-_'); 
} 

/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ 
function recaptcha_mailhide_url($pubkey, $privkey, $email) { 
    if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { 
     die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . 
      "you can do so at <a href='http://www.google.com/recaptcha/mailhide/apikey'>http://www.google.com/recaptcha/mailhide/apikey</a>"); 
    } 


    $ky = pack('H*', $privkey); 
    $cryptmail = _recaptcha_aes_encrypt ($email, $ky); 

    return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); 
} 

function _recaptcha_mailhide_email_parts ($email) { 
    $arr = preg_split("/@/", $email); 

    if (strlen ($arr[0]) <= 4) { 
     $arr[0] = substr ($arr[0], 0, 1); 
    } else if (strlen ($arr[0]) <= 6) { 
     $arr[0] = substr ($arr[0], 0, 3); 
    } else { 
     $arr[0] = substr ($arr[0], 0, 4); 
    } 
    return $arr; 
} 

function recaptcha_mailhide_html($pubkey, $privkey, $email) { 
    $emailparts = _recaptcha_mailhide_email_parts ($email); 
    $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); 

    return htmlentities($emailparts[0]) . "<a href='" . htmlentities ($url) . 
     "' onclick=\"window.open('" . htmlentities ($url) . "', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;\" title=\"Reveal this e-mail address\">...</a>@" . htmlentities ($emailparts [1]); 

} 

?> 

回答

1

我也經歷着我所有的網站這些問題,在開發模式下運行時。不要緊,如果與虛擬主機(即:mydomain.local)或只是「平面」本地主機(本地主機/ mydomain)運行。一旦我切換到真正的生產服務器上進行生產,recaptcha就像魅力一樣。

所以我想,一定有什麼與Apache相關。最明智的代碼是通過php進行的http請求,但我已經檢查過fsockopen工作正常。沒有警告或錯誤顯示,神祕的事情是$迴應總是空的。

我試着在我的領域,formacion online,這是一個VPS,它似乎工作確定。 phpinfo()顯示的大多數值中的設置相同。

+0

這是一個有用的信息。無論如何,我已從我的頁面驗證中刪除了recaptcha,並使用了第三方驗證碼。將在下一個Web版本中嘗試與你的建議。 –