Saltar al contenido

¿Cómo validar Google reCAPTCHA v3 en el lado del servidor?

Solución:

Seguridad de la clave privada

Si bien las respuestas aquí definitivamente funcionan, están usando un GET solicitud, que expone su clave privada (aunque https se utiliza). En Google Developers, el método especificado es POST.

Para más detalles: https://stackoverflow.com/a/323286/1680919

Verificación vía POST

function isValid() 
{
    try {

        $url="https://www.google.com/recaptcha/api/siteverify";
        $data = ['secret'   => '[YOUR SECRET KEY]',
                 'response' => $_POST['g-recaptcha-response'],
                 'remoteip' => $_SERVER['REMOTE_ADDR']];
                 
        $options = [
            'http' => [
                'header'  => "Content-type: application/x-www-form-urlencodedrn",
                'method'  => 'POST',
                'content' => http_build_query($data) 
            ]
        ];
    
        $context  = stream_context_create($options);
        $result = file_get_contents($url, false, $context);
        return json_decode($result)->success;
    }
    catch (Exception $e) {
        return null;
    }
}

Sintaxis de matriz: Yo uso la sintaxis de matriz “nueva” ( [ and ] en lugar de array(..) ). Si su versión de php aún no admite esto, tendrá que editar esas 3 definiciones de matriz en consecuencia (ver comentario).

Valores devueltos: Esta función devuelve true si el usuario es válido, false si no, y null si ocurrió un error. Puede usarlo, por ejemplo, simplemente escribiendo if (isValid()) { ... }

esta es la solucion

index.html

<html>
  <head>
    <title>Google recapcha demo - Codeforgeek</title>
    <script src="https://www.google.com/recaptcha/api.js"></script>
  </head>
  <body>
    <h1>Google reCAPTHA Demo</h1>
    <form id="comment_form" action="form.php" method="post">
      <input type="email" placeholder="Type your email" size="40"><br><br>
      <textarea name="comment" rows="8" cols="39"></textarea><br><br>
      <input type="submit" name="submit" value="Post comment"><br><br>
      <div class="g-recaptcha" data-sitekey="=== Your site key ==="></div>
    </form>
  </body>
</html>

verificar.php

<?php
    $email; $comment; $captcha;

    if(isset($_POST['email']))
        $email=$_POST['email'];
    if(isset($_POST['comment']))
        $comment=$_POST['comment'];
    if(isset($_POST['g-recaptcha-response']))
        $captcha=$_POST['g-recaptcha-response'];

    if(!$captcha){
        echo '<h2>Please check the the captcha form.</h2>';
        exit;
    }

    $response = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR SECRET KEY&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']), true);
    if($response['success'] == false)
    {
        echo '<h2>You are spammer ! Get the @$%K out</h2>';
    }
    else
    {
        echo '<h2>Thanks for posting comment.</h2>';
    }
?>

http://codeforgeek.com/2014/12/google-recaptcha-tutorial/

No soy fanático de ninguna de estas soluciones. Yo uso esto en su lugar:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'secret' => $privatekey,
    'response' => $_POST['g-recaptcha-response'],
    'remoteip' => $_SERVER['REMOTE_ADDR']
]);

$resp = json_decode(curl_exec($ch));
curl_close($ch);

if ($resp->success) {
    // Success
} else {
    // failure
}

Yo diría que esto es superior porque te aseguras de que se envíe al servidor y no esté haciendo una llamada ‘file_get_contents’ incómoda. Esto es compatible con recaptcha 2.0 descrito aquí: https://developers.google.com/recaptcha/docs/verify

Encuentro este limpiador. Veo que la mayoría de las soluciones son file_get_contents, cuando creo que curl sería suficiente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *