Recaptcha больше не работает после обновления до версии стиля флажка

0

Я использую новую версию Recaptcha - ту, которая имеет флажок вместо текстового поля.

Однако это не работает. Хотя появляется новый Recaptcha, я просто получаю страницу с ошибкой каждый раз, когда я устанавливаю флажок.

Я просмотрел документацию, и он не упоминает ничего, кроме старого, о настройке.

Я загрузил последнюю recaptchalib.php, добавил <script src='https://www.google.com/recaptcha/api.js'></script> в свой заголовок и настроил свой сценарий на стороне сервера как таковой:

  require_once('recaptchalib.php');
  $privatekey = "myprivatekey";
  $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER["REMOTE_ADDR"],
                                $_POST["recaptcha_challenge_field"],
                                $_POST["recaptcha_response_field"]);

  if (!$resp->is_valid) {
    //CAPTCHA was entered incorrectly
    header( "Location: $error_page" );

    die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
         "(reCAPTCHA said: " . $resp->error . ")");
  } else {
    //Successful verification

Моя клиентская сторона кажется прекрасной, просто:

<div class="g-recaptcha" data-sitekey="mypublickey"></div>

Конечно, я дважды проверил оба ключа, и все мои пути верны.

Есть ли новая библиотека, которую я хотел использовать, или другой способ обработки для нового флажка типа Recaptcha? Все, что я делаю неправильно?

Теги:
recaptcha
captcha

2 ответа

1

Вы абсолютно уверены, что вы включили recaptchalib.php, который использует новый API? Вы можете проверить это?

Я спрашиваю об этом, потому что вижу, что последняя версия recaptcha-php равна 1.11, которая была выпущена в 2010 году, и я не вижу никаких обновлений в их VCS.

Эта библиотека использует старый API:

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

Новый API следует называть как:

https://www.google.com/recaptcha/api/siteverify?secret=your_secret&response=response_string&remoteip=user_ip_address

Простая реализация для формы входа может выглядеть так:

<form role="form" method="POST" action="/login_check.php">
   <input type="text" class="" id="username" placeholder="Enter username">
   <input type="password" class="" id="password">

   <div class="g-recaptcha" data-sitekey="[YOUR SITE KEY]"></div>
</form>

<script src='https://www.google.com/recaptcha/api.js'></script>

В login_check.php:

<?php

// Get yours from https://www.google.com/recaptcha/intro/index.html
$api_secret     = 'YOUR API SECRET';
$api_endpoint   = 'https://www.google.com/recaptcha/api/siteverify';

if ((strtoupper($_SERVER["REQUEST_METHOD"])) === "POST") {

    if (empty($_POST['g-recaptcha-response'])) {
        // The user did not complete reCAPTCHA
        header("location: index.php");
        exit;
    }

    $api_url    = sprintf('%s?secret=%s&response=%s&remoteip=%s', $api_endpoint, $api_secret, $_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
    $response   = json_decode(apiVerify($api_url), true);

    // reCAPTCHA is NOT correct.
    if (false === $response['success']) {
        // The user is not a human.
        header("location: index.php");
        exit;
    }

    // reCAPTCHA was correct, so you can go ahead and check login credentials ...

    echo "Welcome !";
}

function apiVerify($url)
{
    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16");

    $data = curl_exec($curl);

    curl_close($curl);

    return $data;
}

Вы могли (и должны) расширить этот пример, чтобы показать некоторую обратную связь с пользователем, выполнить некоторую дополнительную проверку и т.д., Но я думаю, что этого достаточно, чтобы вы начали.

  • 0
    Спасибо, я думаю, что вы правы, но я понятия не имею, как включить это в мой почтовый файл php. Есть идеи?
  • 0
    @MeltingDog Я добавил базовый пример реализации. Может быть, это поможет вам начать.
Показать ещё 1 комментарий
0

Да, "последний" recaptchalib.php не обновлялся годами. Обязательно дайте Google Doc 1-звездочный рейтинг, и они могут что-то сделать. Я обходил круги вокруг этого, пока не понял, что recaptchalib.php файле recaptchalib.php.

В этом сообщении объясняется, как использовать этот recaptchalib.php без лишних шуток.

Как вы уже сказали, на вашей странице вам нужно:

<script src='https://www.google.com/recaptcha/api.js'></script>

<form method="POST" action="/your-action-page.php">

    <!-- All your form fields here -->

    <div class="g-recaptcha" data-sitekey="yourpublickey"></div>

    <input type="submit" value="Submit" />

</form>

Затем в вашем-action-page.php вам потребуется следующее:

<?php 

    require_once('path-to/recaptchalib.php');

    $secret = "yoursecretkey";  

    $response = null;

    $reCaptcha = new ReCaptcha($secret);


    if ($_POST["g-recaptcha-response"]) {

        $response = $reCaptcha->verifyResponse( $_SERVER["REMOTE_ADDR"],  $_POST["g-recaptcha-response"] ); 

    } 

    if ($response != null && $response->success) {  

        // Your code to handle a successful verification

    } 

    else {

        // What happens when the CAPTCHA is entered incorrectly

    }

?>

И не забудьте загрузить альтернативу recaptchalib.php:

<?php

/**
* This is a PHP library that handles calling reCAPTCHA.
*    - Documentation and latest version
*          https://developers.google.com/recaptcha/docs/php
*    - Get a reCAPTCHA API Key
*          https://www.google.com/recaptcha/admin/create
*    - Discussion group
*          http://groups.google.com/group/recaptcha
*
* @copyright Copyright (c) 2014, Google Inc.
* @link      http://www.google.com/recaptcha
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

/**
* A ReCaptchaResponse is returned from checkAnswer().
*/

class ReCaptchaResponse {
    public $success;
    public $errorCodes;
}

class ReCaptcha {
    private static $_signupUrl = "https://www.google.com/recaptcha/admin";
    private static $_siteVerifyUrl =
    "https://www.google.com/recaptcha/api/siteverify?";
    private $_secret;
    private static $_version = "php_1.0";

    /**
     * Constructor.
     *
     * @param string $secret shared secret between site and ReCAPTCHA server.
     */

    function ReCaptcha($secret) {
        if ($secret == null || $secret == "") {
            die("To use reCAPTCHA you must get an API key from <a href='"
            . self::$_signupUrl . "'>" . self::$_signupUrl . "</a>");
        }
        $this->_secret=$secret;
    }

    /**
     * Encodes the given data into a query string format.
     *
     * @param array $data array of string elements to be encoded.
     *
     * @return string - encoded request.
     */

    private function _encodeQS($data) {
        $req = "";
        foreach ($data as $key => $value) {
        $req .= $key . '=' . urlencode(stripslashes($value)) . '&';
        }
        // Cut the last '&'
        $req=substr($req, 0, strlen($req)-1);
        return $req;
    }

    /**
     * Submits an HTTP GET to a reCAPTCHA server.
     *
     * @param string $path url path to recaptcha server.
     * @param array  $data array of parameters to be sent.
     *
     * @return array response
     */

    private function _submitHTTPGet($path, $data) {
        $req = $this->_encodeQS($data);
        $response = file_get_contents($path . $req);
        return $response;
    }

    /**
     * Calls the reCAPTCHA siteverify API to verify whether the user passes
     * CAPTCHA test.
     *
     * @param string $remoteIp   IP address of end user.
     * @param string $response   response string from recaptcha verification.
     *
     * @return ReCaptchaResponse
     */

    public function verifyResponse($remoteIp, $response) {
        // Discard empty solution submissions
        if ($response == null || strlen($response) == 0) {
            $recaptchaResponse = new ReCaptchaResponse();
            $recaptchaResponse->success = false;
            $recaptchaResponse->errorCodes = 'missing-input';
            return $recaptchaResponse;
        }
        $getResponse = $this->_submitHttpGet(
            self::$_siteVerifyUrl,
            array (
                'secret' => $this->_secret,
                'remoteip' => $remoteIp,
                'v' => self::$_version,
                'response' => $response
            )
        );
        $answers = json_decode($getResponse, true);
        $recaptchaResponse = new ReCaptchaResponse();
        if (trim($answers ['success']) == true) {
            $recaptchaResponse->success = true;
        }
        else {
            $recaptchaResponse->success = false;
            $recaptchaResponse->errorCodes = $answers [error-codes];
        }
        return $recaptchaResponse;
    }
}
?>

Надеюсь, это поможет! :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню