Как реализовать reCAPTCHA от google на моем веб-сайте?


Я пытаюсь развернуть reCAPTCHA Google на моем сайте, и я не могу сделать интеграцию Server-Side (я Использую язык - PHP). Как я могу сделать так, чтобы reCAPTCHA работало, и выполните проверку, прежде чем отправить данные из моей формы?

Источник и Документацию Google reCAPTCHA

Author: Jorge B., 2015-04-24

3 answers

Введение в reCAPTCHA

, reCAPTCHA-это новый инструмент от Google, чтобы защитить сайт от спамеров и ботов. Он приходит идея novadora, потому что до сих пор капча рассматривались скорее как помеха, чем помощник пользователями. С рекапчи это отличается, потому что все, что пользователь должен сделать, это нажать на checkbox, подтверждающий, что вы не робот. Таким образом, выигрывают все, пользователь имеет быстрый доступ к желаемой информации, и вы держите нежелательных посетителей вашего сайта.

Удивительно! Я хочу, чтобы таких, как я?

Первый шаг, вы получаете ключ для вашего сайта. Перейдите на веб-сайт ниже и нажмите кнопку синяя кнопка находится в положении верхней-правой части веб-сайт, написанный "Get reCAPTCHA": https://www.google.com/recaptcha/intro/index.html

После того, как зарегистрирован ваш веб-сайт, вы будете иметь на руках два важных значения: раздел сайта, secret (я буду называть секретным ключом). Первый шаг для реализации reCAPTCHA на ваш сайт, вставить API на вашем сайте. Введите код внутри тега head вашем сайте:

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

, Все готово для следующего шага.

Создание формы

Создайте общей формы, я сделал два поля: один для пользователя, чтобы ввести имя, а другой-для сообщения любой. Разметка осталась так:

<h1>Exemplo de formulário com o reCaptcha</h1>
		
<form action="formulario.php" method="post">
  Digite seu nome: <input type="text" name="nome"><br><br>
  Deixe sua mensagem: <br>
  <textarea name="mensagem" rows="7" cols="35"></textarea><br><br>
  <input type="submit" value="Submit" name="formulario">
</form>

Вставьте reCAPTCHA в форму, чрезвычайно прост, вам просто нужно добавить следующий элемент в положении, которое вы хотите, и он появится:

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

Не забудьте заменить ЕГО КЛЮЧЕВЫХ ключ, который вы получили на сайте, напоминая, что это - раздел сайта, а не секретный ключ!

Замените свойство action тег form имя файла PHP, который будет проверять бланк. Вы можете проверить на той же странице, но я предпочел оставить в отдельный код становится проще.

Но я не могу проверить с помощью JavaScript в час?

Нет :) Вы уже понимаете, почему.

, Создав код PHP для проверки формы

Давайте получить значение поля имя и сообщение, что пользователь отправил:

if (isset($_POST['nome'])) {
    $nome = $_POST['nome'];
}

if (isset($_POST['mensagem'])) {
    $mensagem = $_POST['mensagem'];
}

Отсюда, что проверка captcha происходит на самом деле. Нам послан POST значение предоставляемых reCAPTCHA, можно получить это значение в переменной $_POST['g-recaptcha-response']. Логотип:

if (isset($_POST['g-recaptcha-response'])) {
    $captcha_data = $_POST['g-recaptcha-response'];
}

// Se nenhum valor foi recebido, o usuário não realizou o captcha
if (!$captcha_data) {
    echo "Por favor, confirme o captcha.";
    exit;
}

, Кажется, что все кончено, не так ли? Нет! Теперь, что самое интересное, помните, когда я сказал, что это необходимо, что captcha должен был пройти проверку PHP? Это необходимо, поскольку reCAPTCHA использует информацию в базе данных Google, которая содержит различную информацию о пользователе, который "вошел" в captcha. Таким образом можно отличить обычных пользователей от ботов. Для validarmos в пользователь, нам нужно сделать запрос API reCAPTCHA, используя file_get_contents. Обратите внимание:

$resposta = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=SUA-CHAVE-SECRETA&response=".$captcha_data."&remoteip=".$_SERVER['REMOTE_ADDR']);

Найдите в середине URL-адреса ЕГО-КЛЮЧ-СЕКРЕТНЫЙ и заменить на свою. Что эта команда делает, это получить данные в API reCAPTCHA информацию о значениях, которые были заданы по captcha, а также отправить в IP-адреса пользователя и для будущих оценок.

, запроса отправлено, только в отсутствие лечения ответ:

if ($resposta.success) {
    echo "Obrigado por deixar sua mensagem!";
} else {
    echo "Usuário mal intencionado detectado. A mensagem não foi enviada.";
    exit;
}

Я Надеюсь, что вы понимать, как работает система. Любой, несомненно, уже знаете, мы здесь, чтобы помочь. ;)

 54
Author: Rafael Almeida, 2018-07-06 10:54:45

ОТВЕТ, ПОЛНОСТЬЮ ПЕРЕРАБОТАННЫЙ. Причина: я собрал информацию, как я пошел открывать и был очень плох. Благодарю Rafael Almeida, первый ответ, который мне очень помог и привел меня, чтобы узнать больше вещей. И администраторам, которые внесли изменения, которые направляли меня улучшить ответ. Мой ответ существует только добавить информацию отличная работа уже сделана Rafael Almeida.

Код на стороне клиента (HTML и JavaScript)

, поднятый: но я не могу проверить с помощью JavaScript в час?

Даст сделать, на самом деле, с помощью AJAX: отправить данные в PHP и получить ответ до отправки всей формы, в остальных полях. Тем не менее, не похоже, усилия необходимо, так как, при нажатии на reCAPTCHA, он не выпускает, пока пользователь не даст правильный ответ. По крайней мере, не видела ничего, кроме с, или без бренда "check", чтобы указать, что все в порядке (например, не видел красный крестик на месте). Другими словами, reCAPTCHA-это "все или ничего": либо пользователь не ответил или ответил и ответил правильно.

, что кажется, чтобы быть полезным здесь делать проверки в JS перед отправкой на PHP, чтобы знать, если пользователь по крайней мере, использовал reCAPTCHA, чтобы избежать отправки всей формы. Это очень легко, потому что API уже есть функции, это просто положить что-то, так и в функции, которые выполняет в onsubmit формы:

 if (grecaptcha.getResponse() == "")
 {
      alert("Você não clicou no reCAPTCHA, por favor, faça!")
      return false;
 }

Код на стороне сервера (PHP)

, что мне потребовалось получить более подробную информацию, чем код с file_get_contents не работает для меня. Первоначально, я думал, что проблема была способ передачи функции (GET, в то время как веб reCAPTCHA говорит, что нужно быть ПОСТ). После, я обнаружил, что прекрасно работает на копию сайта, размещенную на моем ПК. То есть, это сервер на хостинг (я использую Hostmídia), что блокирует. Я все еще пытался, но без успех:

ini_set('allow_url_fopen', 1)

Альтернативный ответ, на основе cURL, может быть полезно для тех, кто имеет сайт на одном хостинге, или в другой, который также блокирует. В любом случае, может быть интересно, чтобы предотвратить, в случае warning, оставайтесь зарегистрирован в log URL-адрес, в том числе секретного ключа. Следующий код:

# Os parâmetros podem ficar em um array
$vetParametros = array (
    "secret" => "SUA-CHAVE-SECRETA",
    "response" => $_POST["g-recaptcha-response"],
    "remoteip" => $_SERVER["REMOTE_ADDR"]
);
# Abre a conexão e informa os parâmetros: URL, método POST, parâmetros e retorno numa string
$curlReCaptcha = curl_init();
curl_setopt($curlReCaptcha, CURLOPT_URL,"https://www.google.com/recaptcha/api/siteverify");
curl_setopt($curlReCaptcha, CURLOPT_POST, true);
curl_setopt($curlReCaptcha, CURLOPT_POSTFIELDS, http_build_query($vetParametros));
curl_setopt($curlReCaptcha, CURLOPT_RETURNTRANSFER, true);
# A resposta é um objeto json em uma string, então só decodificar em um array (true no 2º parâmetro)
$vetResposta = json_decode(curl_exec($curlReCaptcha), true);
# Fecha a conexão
curl_close($curlReCaptcha);
# Analisa o resultado (no caso de erro, pode informar os códigos)
if ($vetResposta["success"]) echo "<p>Captcha OK!</p>\n";
else 
{
    echo "$<p>Problemas:</p>\n";
    foreach ($vetResposta["error-codes"] as $strErro) echo "$strTab<p>Erro: $strErro</p>\n";
}

Немного дальше, все еще на стороне сервера...

Если вы посмотрите инструкции на сайте reCAPTCHA, есть индикация библиотеки, которая находится на github, в /google/recaptcha. Также хорошо работает в: этого было достаточно, чтобы поместить папку src в ZIP скачали где-то сайт, и использовать код, как показано них. Единственная проблема заключается в том, что давал следующее сообщение об ошибке:

Недопустимый json

Таким образом, я нашла совет в другой статье Stackoverflow (индикация метод CurlPost):

$recaptcha = new \ReCaptcha\ReCaptcha($secret, new \ReCaptcha\RequestMethod\CurlPost());
$resp = $recaptcha->verify($gRecaptchaResponse, $remoteIp);
if ($resp->isSuccess()) {
    // verified!
} else {
    $errors = $resp->getErrorCodes();
}

Для этого не проверял, если проблема была на хостинг, или в самой класса библиотека.


 16
Author: Binho RbSoft, 2015-12-14 10:59:23

Именно полная реализация reCaptcha, который я использую на сайте, который я разрабатываю, единственное, чего не хватает для запуска на 100%, то для создания объектов, но я хорошо описано, как создавать их, я всего лишь студент, поэтому я сделал все, что мог.

<?php ini_set('display_errors',1); ini_set('display_startup_erros',1); error_reporting(E_ALL); ?><!--Força o php a mostrar todo tipo de erro, linha temporária-->
    <?php
    function __autoload($class_name){
        require_once '../_lib/'.$class_name.'.php';//-->lê minhas classes de forma automática
    }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <link rel="stylesheet" type="text/css" href="_css/login.css"/>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
        <script src='https://www.google.com/recaptcha/api.js'></script>
        <script>
            $(document).ready(function() {
                $('#send').prop('disabled', true);//desativa o botão enviar
                $('.g-recaptcha').hide();//esconde o captcha
                validate();
                $('#inputEmail, #inputPassword').change(validate);
            });
            function validate() {
                if ($('#inputEmail').val().length > 10) {//enquanto o campo de email nao tiver menos que 10 caracteres, não ativa o reCaptcha
                    $('.g-recaptcha').show();//exibe o reCaptcha
                }else{//se mudar de ideia e reduzir o campo pra menos de 10 caracteres...
                    $('.g-recaptcha').hide();//o reCaptcha se esconde novmanete
                }
            }
            function enableSend() {
                $('#send').prop('disabled', false);//quando o captcha é confirmado, ativa o botao enviar
            }
        </script>
    </head>

    <body>
    <?php
    $helper = new Helpers();//-->objeto com vários métodos importantes
    if (isset($_POST['attempt'])){//verifica se tem tentativa restante
        $attempt = intval($helper->validation($_POST['attempt']));//validation=método que verifica e escapa minha sring (trim(), stripcslashes() e htmlspecialchars())
    }else{
        $attempt = 3;//se não for definido número de tentativas, aqui é definido como 3
    }

    if (isset($_POST['g-recaptcha-response']) and isset($_POST['username']) and isset($_POST['password'])) {//garante que todos os campos foram preenchidos
        $captcha_data = $_POST['g-recaptcha-response'];
        if ($captcha_data) {//Verificação do reCaptcha
            $resposta = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=DIGITE-SUA-CHAVE-SECRETA-GERADA-PELO-GOOGLE-AQUI=" . $captcha_data . "&remoteip=" . $_SERVER['REMOTE_ADDR']);
            if ($resposta) {//validação do reCaptcha
                $username = strtolower($helper->validation($_POST['username']));
                $password = $helper->validation($_POST['password']);
                $user = new User();//--->meu objeto que acessa o banco de dados usando PDO
                $userValidated = $user->checkPasswordHash($username);//--->método do meu objeto que procura o usuario no bacno de dados (SELECT * FROM tbl_Users WHERE username = $username)
                if ($userValidated){//verifica se o email existe, se existir...
                    if ($userValidated->status == 1){//verifica se a conta está bloqueada ou não
                        echo 'Essa conta está bloqueada, criar botão para reenviar o email de recuperação...';
                    }else{
                    $hash = $userValidated->password;//retorna o hash do password
                    if (password_verify($password, $hash)) {//compara a senha e o hash que foi criado usando password_hash() e salvo no banco de dados
                        echo 'Password é válido, inserir código que inicia as sessões e chama a próxima página';//-->insira seu código
                    } else {//caso o password estjeja errado, perde uma tentativa
                        if ($attempt != 1){//se a tentativa restante for igual a 1, a proxima vez será direcionado para a página de recuperação de senha
                            $attempt--;
                            echo 'Usuário e senha não combinam, você tem mais '.$attempt.' tentativas';//mostra o número de tentativas restante
                        }else{//bloqueia a conta e chama a página de recuperação de senha
                            echo 'inserir código que bloqueia a conta e abre pagina de recuperaçao de senha';//-->insira seu código de bloqueio
                        }
                    }
                    }
                }else{//se o email não existir, perde uma tentativa mas não avisa se o erro foi no email ou na senha
                    if ($attempt != 0){
                        $attempt--;
                        echo 'Usuário e senha não combinam, você tem mais '.$attempt.' tentativas';//mostra o número de tentativas restante
                    }else{//bloqueia a conta e chama a página de recuperação de senha
                        echo 'inserir código que bloqueia a conta e abre pagina de recuperaçao de senha';//-->insira seu código de bloqueio
                    }
                }
            } else {
                echo "Validação não concluída, tente novamente.";
                exit;
            }
        } else {
            echo "Validação não concluída, tente novamente.";
            exit;
        }
    }
    ?>
    <section>
        <form class="login" action="login.php" method="post">
            <fieldset>
                <legend>Login</legend>
                <label for="inputEmail" class="Label">Email: </label>
                <input id="inputEmail" class="inputText" type="email" maxlength="30" name="username" required>
                <label for="inputPassword" class="Label">Password: </label>
                <input id="inputPassword" class="inputPassword" type="password" maxlength="20" name="password" required>
                <div class="g-recaptcha" data-sitekey="DIGITE-A-CHAVE-DO-SEU-SITE-CRIADA-PELO-GOOGLE-AQUI" data-callback="enableSend"></div><!--Linha que adiciona o recaptcha-->
                <input type="hidden" name="attempt" value=<?php echo $attempt ?> /><!--envia por post o numero de tentativas restante-->
                <input type="submit" value="Confirmar" id="send" class="send">
            </fieldset>
        </form>
    </section>

    </body>
    </html>
 0
Author: Rimom Aguiar, 2016-08-09 04:08:16