Usando a validação reCAPTCHA em PHP

Recaptcha
ReCAPTCHA é um serviço gratuito que protege sites de spam e abusos

O CAPTCHA, sigla em inglês para Teste de Turing Público Completamente Automatizado para Distinguir entre Computadores e Pessoas (Completely Automated Public Turing test to tell Computers and Humans Apart), é um dos principais recursos usados para garantir que o acesso a um sistema ou a uma página é feito por humanos, e não por robôs.

Certamente você já teve que preencher um CAPTCHA ao enviar um formulário ou fazer login. É uma medida de segurança para evitar spam, decriptografia de senhas e sobrecarga do sistema. Um dos serviços mais populares é o reCAPTCHA, gerenciado pelo Google. Neste post você verá como implantá-lo no seu site usando linguagem PHP.

Primeiramente, é necessário registrar seu site no reCAPTCHA. Este registro lhe dará uma chave pública e uma chave privada, que serão usadas para verificação dos formulários com o teste de desafio. Depois disso, você colocará o código para colocar o desafio CAPTCHA dentro do seu formulário, entre as tags <form></form>. Este código deverá conter a sua chave pública.

Ao submeter o formulário, caso a resolução do desafio tenha sido positiva, será criado uma variável g-recaptcha-response, com uma chave única. Esta chave deverá ser confrontada com a sua chave privada, usando a API do Google reCAPTCHA, chamada pelo código:

// json-decode(): Transforma o JSON de retorno da API em variáveis do PHP
// $secretKey: sua chave secreta do reCAPTCHA
// $_POST['g-recaptcha-response']: a chave gerada pela resposta ao reCAPTCHA pelo formulário

$RetornaCaptcha = json_decode( file_get_contents( 'https://www.google.com/recaptcha/api/siteverify?secret=' . $secretKey . '&response=' . $_POST['g-recaptcha-response'] ) );

Agora é só usar o parâmetro success da variável (no caso deste exemplo $retornaCaptcha) para determinar o que será exibido no caso do reCAPTCHA válido ou inválido.

$RetornaCaptcha = json_decode( file_get_contents( 'https://www.google.com/recaptcha/api/siteverify?secret=' . $secretKey . '&response=' . $_POST['g-recaptcha-response'] ) );

if($RetornaCaptcha->success){
   echo "reCAPTCHA válido!";
} else {
   echo "reCAPTCHA inválido!";
}

Recentemente fiz um experimento usando a ferramenta reCAPTCHA em um simples formulário de login usando PHP. O código completo está disponível no meu GitHub, mas abaixo segue como foi feita a verificação. Você pode testá-lo, usando (ou não) o usuário test e a senha test123.

<?php

// Get a key from https://www.google.com/recaptcha/admin/create
$publicKey = '';
$secretKey = '';

if(!empty($_POST['g-recaptcha-response']) && !empty($_POST['username']) && !empty($_POST['password'])){
    $RetornaCaptcha = json_decode(file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret=' . $secretKey . '&response=' . $_POST['g-recaptcha-response']));

    // Captcha válido
    if($RetornaCaptcha->success){
        if($_POST['username'] == "test" && $_POST['password'] == "test123"){
        
            // Nome de usuário e senha corretos
            include('success.php');
            exit();
    
        } else {

            // Nome de usuário e senha incorretos
            $msg = 'Username and/or password incorrect. Try again!';
        
        }

    // Captcha inválido
    } else {
        $msg = 'The reCAPTCHA is incorrect. Try again!';

    }
}

// Caso algum campo ou o Captcha não tenha sido preenchido
else if(!empty($_POST)) {
    if(empty($_POST['g-recaptcha-response'])){
        $msg .= 'Please solve the reCAPTCHA<br />';
    }
    if(empty($_POST['password']) || empty($_POST['password'])){
        $msg .= 'Username and password required';
    }

}

include('form.php');

?>
Avatar de Matheus Misumoto