Usa reCAPTCHA con PHP

Importante: Ya no se admite la versión 1.0 de la API de reCAPTCHA. Actualiza a la versión 2.0. Más información

La biblioteca de reCAPTCHA para PHP proporciona una forma sencilla de colocar un CAPTCHA en tu sitio web de PHP, lo que te ayuda a evitar que los bots lo abusen. La biblioteca une la API de reCAPTCHA.

Si quieres usar reCAPTCHA con PHP, puedes descargar la biblioteca de reCAPTCHA para PHP. Solo necesitarás un archivo (recaptchalib.php). Los otros archivos son ejemplos, readme y legales, pero no afectan la funcionalidad.

Inicio rápido

Una vez que te hayas registrado para obtener las claves de API, a continuación encontrarás instrucciones básicas para instalar reCAPTCHA en tu sitio. A continuación, puedes encontrar una guía de referencia completa sobre el complemento de PHP.

Del cliente (cómo hacer que aparezca la imagen CAPTCHA)

Si deseas usar la biblioteca PHP para mostrar el widget de reCAPTCHA, debes insertar este fragmento de código dentro del elemento <form> donde se ubicará el widget de reCAPTCHA:

  require_once('recaptchalib.php');
  $publickey = "your_public_key"; // you got this from the signup page
  echo recaptcha_get_html($publickey);

Con el código, tu formulario podría verse así:

  <html>
    <body> <!-- the body tag is required or the CAPTCHA may not show on some browsers -->
      <!-- your HTML content -->

      <form method="post" action="verify.php">
        <?php
          require_once('recaptchalib.php');
          $publickey = "your_public_key"; // you got this from the signup page
          echo recaptcha_get_html($publickey);
        ?>
        <input type="submit" />
      </form>

      <!-- more of your HTML content -->
    </body>
  </html>

No olvides configurar $publickey mediante el reemplazo de your_public_key por la clave pública de la API.

Ten en cuenta que el valor del atributo "action" es "verify.php". Ahora, verification.php es el archivo de destino al que se envían los valores de este formulario. Por lo tanto, necesitarás un archivo verify.php en la misma ubicación que el HTML del cliente.

La función required_once del ejemplo anterior espera que recaptchalib.php esté en el mismo directorio que el archivo del formulario. Si se encuentra en otro directorio, debes vincularla correctamente. Por ejemplo, si el recaptchalib.php se encuentra en el directorio llamado "captcha", que se encuentra en el mismo nivel que el archivo de formulario, la función se verá de la siguiente manera: require_once('captcha/recaptchalib.php').

En el servidor (cómo comprobar si el usuario ingresó la respuesta correcta)

El siguiente código debe colocarse en la parte superior del archivo Verify.php:

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

  if (!$resp->is_valid) {
    // What happens when the CAPTCHA was entered incorrectly
    die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
         "(reCAPTCHA said: " . $resp->error . ")");
  } else {
    // Your code here to handle a successful verification
  }
  ?>

En el código anterior:

  • recaptcha_check_answer muestra un objeto que representa si el usuario completó correctamente el desafío.
  • Si el valor de $resp->is_valid es verdadero, significa que el desafío de captcha se completó correctamente y debes continuar con el procesamiento del formulario.
  • Si $resp->is_valid es falso, el usuario no pudo proporcionar el texto correcto del captcha y debes volver a mostrar el formulario para permitirle otro intento. En este caso, $resp->error será un código de error que se puede proporcionar a recaptcha_get_html. Pasar el código de error hace que el control de reCAPTCHA muestre un mensaje en el que se explica que el usuario ingresó el texto de forma incorrecta y debe volver a intentarlo.
  • Ten en cuenta que este código solicita la clave privada, la cual no debe confundirse con la clave pública. Eso se obtiene en la misma página que la clave pública.

    Además, asegúrate de que tu formulario esté configurado para obtener las variables del formulario mediante $_POST, en lugar de $_REQUEST, y de que el formulario en sí use el método POST.

    Eso es todo. reCAPTCHA ya debería estar funcionando en tu sitio.

    Material de lectura adicional

  • Cómo personalizar la apariencia
  • Sugerencias y lineamientos
  • Solución de problemas
  • Guía de referencia del complemento de PHP

    A continuación, se muestra una lista completa de todos los métodos del complemento de PHP para reCAPTCHA.

    La función recaptcha_get_html

    La función recaptcha_get_html muestra el código HTML que presenta reCAPTCHA al usuario.

    recaptcha_get_html
    Parámetro
    $pubkey -- string. obligatoria. Tu clave pública de reCAPTCHA, de la página de registro de la API
    $error -- string. opcional (el valor predeterminado es nulo) Si se configura esta cadena, el área de reCAPTCHA mostrará el código de error proporcionado. Este código de error proviene de ReCaptchaResponse->$error
    $use_ssl -- boolean. opcional (false es el valor predeterminado) ¿Debería usarse la API basada en SSL? Si le muestras una página al usuario a través de SSL, asegúrate de configurar esta opción como verdadera para que no aparezca un diálogo de error en el navegador del usuario.
    Valor de muestra Es una cadena que contiene HTML para colocar en la página web.

    La función recaptcha_check_answer

    Una vez que el usuario complete el formulario HTML, incluida su respuesta al CAPTCHA, queremos verificar su respuesta cuando envíe el formulario con la función recaptcha_check_answer. La respuesta del usuario estará en dos campos de formulario: recaptcha_challenge_field y recaptcha_response_field. La Biblioteca de reCAPTCHA realizará una solicitud HTTP al servidor de reCAPTCHA y verificará la respuesta del usuario.

    recaptcha_check_answer
    Parámetro
    $privkey -- string. obligatoria. Tu clave privada de reCAPTCHA, de la página de registro de la API
    $remoteip -- string. obligatoria. La dirección IP del usuario, en el formato 192.168.0.1
    $challenge -- string. obligatoria.
    El valor del campo recaptcha_challenge_field
    $response -- string. obligatoria El valor del campo recaptcha_response_field del formulario
    Valor de muestra Una instancia de la clase ReCaptchaResponse

    ReCaptchaResponse
    Campo
    $is_valid -- booleano ¿reCAPTCHA consideró que la respuesta era válida?
    $error -- cadena Si la respuesta no era válida, ¿cuál fue el problema? Este código de error se puede usar en recaptcha_get_html
    Valor de muestra Es la URL HTML o sin procesar para decodificar la dirección de correo electrónico, según la función a la que llamaste.

    Mailhide

    La biblioteca PHP de reCAPTCHA incluye vinculaciones para la API de Mailhide. Esta API te permite unir un correo electrónico en un reCAPTCHA para evitar que los generadores de spam lo vean: exam...@example.com.

    La parte de Mailhide de la biblioteca PHP requiere el módulo mcrypt de PHP.

    La API de Mailhide consta de dos funciones: recaptcha_mailhide_html y recaptcha_mailhide_url. Las funciones tienen los mismos parámetros. La versión _html muestra HTML que se puede colocar directamente en la página. La parte del nombre de usuario del correo electrónico que se pasa se trunca y se reemplaza por un vínculo que llama a Mailhide. La versión _url te proporciona la URL para decodificar el correo electrónico y te permite colocar el correo electrónico en HTML.

    recaptcha_mailhide_url / recaptcha_mailhide_html
    Parámetro
    $pubkey -- string La clave pública de Mailhide de la página de registro
    $privkey -- string La clave privada de Mailhide de la página de registro
    $email -- string La dirección de correo electrónico que quieres ocultar.

    En el siguiente ejemplo, se muestra cómo usar Mailhide:

    <html><body>
    <?
    require_once ("recaptchalib.php");
    // get a key at http://www.google.com/recaptcha/mailhide/apikey
    $mailhide_pubkey = '';
    $mailhide_privkey = '';
    ?>
    The Mailhide encoding of example@example.com is
    <?
    echo recaptcha_mailhide_html ($mailhide_pubkey,
                                  $mailhide_privkey,
                                  "example@example.com");
    ?>.
    <br>
    The url for the email is:
    <?
    echo recaptcha_mailhide_url ($mailhide_pubkey,
                                 $mailhide_privkey,
                                 "example@example.com");
    ?>
    <br>
    </body></html>