Error in Recaptcha returns me an error in file_get_contents

0

Hello,I'mhavingthisproblemwithrecaptchaonasystemimplementedinPHP,thecodebelowisthecode.

RecaptchainHTMLisso,Idecidedtoleavethisscriptalsofororganization.

<divclass="g-recaptcha" id="captcha" data-sitekey="6LdAHWcUAAAAAPFO6j34mmWwhRer0K8Kp8901jM-" data-error-callback="errorRecaptcha" data-expired-callback="recaptchaExpired"></div>

                        <script>
                            // Função que bloqueia o submit quando o recaptcha expira
                            function recaptchaExpired(){
                                alert("ReCaptcha expirado, por favor verifique novamente !");
                                setTimeout(function(){location.reload()}, 500);
                            }

                            function errorRecaptcha(){
                                alert("Erro ao Validar Recaptcha");
                                setTimeout(function(){location.reload()}, 500);
                            }
                        </script>

In PHP I do this to validate

$captcha = $_POST['g-recaptcha-response'];
$secret_key = "***";

$content = http_build_query(array(
'secret' => $secret_key,
'response' => $captcha,
));

$context = stream_context_create(array(
'http' => array(
    'method' => 'POST',
    'content' => $content
)
));

//A função abaixo realiza o envio da resposta captcha para verificação e tem como retorno um JSON
$result_json = file_get_contents('https://www.google.com/recaptcha/api/siteverify', null, $context);

$array_result = json_decode($result_json, true);

//Valida se o retorno do servidor é true ou false para o captcha informado
$resp_captcha = intval($array_result['success']);
if ($resp_captcha === 1) {
    
asked by anonymous 16.08.2018 / 18:21

1 answer

1

Using ReCaptcha on the site

As you have not exactly exemplified how your form is, I'll create an example use with a login form:

<form action="login.php" method="post">
    <input type="text" name="username" placeholder="Digite o seu nome de usuário">
    <input type="password" name="password" placeholder="Digite a sua senha">
    <div class="g-recaptcha" data-sitekey="SUA-CHAVE"></div>
</form>

In login.php you would have the following logic implemented:

// Aqui você recebe um valor fornecido pelo reCAPTCHA 
$captcha_code = $_POST['g-recaptcha-response'];

// Caso nenhum valor for recebido é porque o usuário nem respondeu o captcha
if (!$captcha_code) {
    echo "Por favor, responda o captcha.";
    exit;
}

// Se o usuário realmente respondeu o reCAPTCHA vamos fazer uma requisição para a API do captcha utilizando o file_get_contents do php

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

// Lembre de colocar a sua chave secreta onde está SUA-CHAVE-SECRETA

// Agora vamos validar se realmente a resposta é válida

if ($answer_captcha['success'] == false) {
    echo "Você precisa provar que não é um robô.";
    exit;
} else {
    echo "Logado com sucesso!";
}

About the error, Google recommends, and it is ideal that the validation is done on the server-side (it does not even allow you to do it on the client side). What you would have to do is get the Captcha response with Javascript and use it on an AJAX call.

On this function below, you do not have to use it because reCAPTCHA already validates if it is expired, all by accessing the API.

<script>

// Função que bloqueia o submit quando o recaptcha expira
function recaptchaExpired() {
    alert("ReCaptcha expirado, por favor verifique novamente !");
    setTimeout(function () {
        location.reload()
    }, 500);
}

</script>

The documentation link below shows all the errors and what they can cause.

Any questions go to the Google ReCaptcha documentation by clicking here .

    
16.08.2018 / 21:05