Utilizar reCAPTCHA con PHP

reCAPTCHA es un servicio gratuito que permite incluir validación mediante el uso de captcha a los formularios para prevenir el SPAM. Ademas sirve para digitalizar libros pues reCAPTCHA muestras dos palabras una para verificar el captcha y la otra es una imagen que no ha sido reconocida por los OCR y que nosotros la reconoceremos.

Utilizar reCAPTCHA

reCAPTCHA es gratuito y posee todo un API para integrarlo con cualquier proyecto. Para utilizarlo necesitas registrarte para obtener los codigos de valdación para utilizar el API. Una vez registrado tendrás dos códigos: Public Key y Private Key. Pueden utilizar directamente el API o pueden utilizar alguna de las librerías que ofrecen por ejemplo para PHP, ASP.NET, Python, Perl, etc.

En nuestro caso escogemos PHP y descargamos el archivo recaptcha-php-1.10.zip el cual contiene el archivo recaptchalib.php con los métodos necesarios para el uso de reCAPTCHA.

Incluir reCAPTCHA en el Formulario

Para utilizar la protección mediante captcha, es necesario incluir reCAPTCHA en nuestro formulario, para ello primero incluir el archivo recaptchalib.php, agregamos variables con los valores de nuestros key recién obtenidos.

  1. require_once('recaptchalib.php');
  2. $publickey = "6LdA4goAAAAAAOoJNAhYRlvfyrE-_zv6XrrUJjhkj";
  3. $privatekey = "6LdA4goAAAAAAF1tiVwumBvttvdhSx5qC6xUJjhkj";
  4. $error = null;

Ahora podremos utilizar la función recaptcha_get_html para mostrar el captcha.

  1. <form method="post">
  2.    <label for="username">Usuario</label><br />
  3.    <input name="username" type="text" class="casilla" id="username" /><br />
  4.    <label for="usermail">Email</label><br />
  5.    <input name="usermail" type="text" class="casilla" id="usermail" /><br />
  6.    <label for="usercheck">Verificaci&oacute;n</label><br />
  7.    <?php echo recaptcha_get_html($publickey, $error); ?>
  8.    <input type="hidden" name="action" value="register" />
  9.     <input type="submit" name="btsend" value="Enviar" />
  10. </form>

Validar el Captcha

Una ves que el formulario se ha enviado procedemos a verificar que el texto de captcha se ha ingresado correctamente en cuyo caso procesamos los datos del formulario de lo contrario mostramos un mensaje de error.

  1. if ($_POST['action'] == "register") {
  2.    $re_ip = $_SERVER["REMOTE_ADDR"];
  3.    $re_challenge = $_POST["recaptcha_challenge_field"];
  4.    $re_response = $_POST["recaptcha_response_field"];   
  5.    $re_valid = recaptcha_check_answer($privatekey, $re_ip, $re_challenge, $re_response);
  6.    
  7.    if ($re_valid->is_valid) {
  8.       // procesar registro
  9.    } else {
  10.       $error = $resp->error;
  11.    }
  12. }

Uniendo estos pasos en un archivo, obtendremos la protección anti-spam que estabamos buscando. Pueden ver el ejemplo funcionando en http://samples.unijimpe.net/recaptcha/. También les dejo los archivos fuente para que puedan hacer sus pruebas, noten que deben colocar sus propios keys de validación.

Mas Información
Pueden personalizar reCAPTCHA o utilizarlo con cualquier otro lenguaje de programación, para ello pueden encontrar mas información en:

Comentarios Total 12 comentarios


Carluis Pérez
Publicado: 05/02/2010 5:20 pm

Excelente… es una buena forma de Utilizar reCAPTCHA! buen tema unijimpe muy teorico y buen explicado…

Acortar URLs con PHP y API Bit.ly | unijimpe
Publicado: 10/04/2010 1:17 am

[...] Web Analytics Open SourcePublicar Feeds en Twitter con FeedburnerSeguridad en Upload de ArchivosUtilizar reCAPTCHA con PHPOptimización: Utilizar compresión GzipOptimización: Agregar Headers de ExpiraciónCategorias [...]

javier
Publicado: 08/05/2010 4:02 pm

Muy buen tutorial, una pregunta; como se le cambia el diseño al recaptcha

saludos!!!

unijimpe
Publicado: 08/05/2010 9:29 pm

Javier, para crear un captcha personalizado utilizando el API de reCAPTCHA puedes leer http://www.web-development-blog.com/archives/create-custom-recaptcha-images-using-their-api/

Daniel
Publicado: 09/05/2010 3:28 pm

Hola, primero que nada gracias por el tutorial, pero tengo 2 problemas…

1) me sale este error (me descague los archivos, puse mis claves y eso)

el error es:
Notice: Undefined index: action in C:\wamp\www\prueba\recaptcha\index.php on line 12

como me puede salir esto?, si es el archivo que pusistes para descargar?…yo pensaba que lo unico que habia que modificar eran las llaves…

2)…bueno esto que pasa no se si se deba al error anterior, pero puse para validar los 2 campos que tienes y despues darle la accion al form para que despues se fuera a otra pagina al darle click al boton enviar..pero si escribo todo se envia..pero si escribo aun asi todo sin el captcha, igual se envia…que seguridad es esta? :S

gracias de ante mano :)

unijimpe
Publicado: 09/05/2010 11:37 pm

Daniel, la versión que tienes de PHP te esta imprimiendo las advertencias los cuales no son errores si no sugerencias, entonces para mostrar solo los errores pues colocar el siguiente código al inicio del archivo index.php

<?php error_reporting(E_ERROR); ?>

Daniel
Publicado: 10/05/2010 1:19 pm

Hola, vale muchisimas gracias, eso no lo sabía…bueno, pero ahora tengo un inconveniente, espero que no sea mucha molestia…pero es que he tratado de buscar una solución en la net pero no la encuentro, y por lo visto eres el unico que puede ayudarme…creo que es algo muy sencillo de solucionar, pero teniendo en cuenta que soy nuevo…pido disculpas de ante mano…Hice un video corto, mostrando mi problema… asi es mas facil para ti ver cual es el problema ;)

http://www.youtube.com/watch?v=omrXPid8JOk

Por cierto, este es el codigo, por si lo necesitas:

is_valid) {
// procesar registro
echo “Registro completo”;
exit;
} else {
$error = $resp->error;
}
}
?>

reCAPTCHA Demo

//–>

Registro

Usuario

Email

Verificación

Una cosa que me acabo de acordar, la advertencia que me muestra, sera por que hay algo que no esta del todo bien?, o algo que se puede mejorar?

MUCHAS GRACIAS DE ANTE MANO “unijimpe” y perdona por el largo comentario.

Daniel
Publicado: 10/05/2010 1:22 pm

Parece ser que el codigo se ve mal…dime si lo necesitas y te lo mando por un mensaje privado o algo ;) GRACIAS

SlimThug
Publicado: 26/06/2010 10:21 pm

Como hago para que si ingresan mal el valor del captcha, no se limpie el formulario?

unijimpe
Publicado: 26/06/2010 10:46 pm

SlimThug, para no perder los valores del formulario, deber recuperarlo de las variables de formulario enviadas, en nuestro ejemplo para no perder el dato del nombre del usuario se tendría:

<label for="username">Usuario</label<<br /<
<input name="username" type="text" class="casilla" id="username" value="<?php echo $_POST['username']; ?>" /><br />

SlimThug
Publicado: 26/06/2010 10:49 pm

para cambiar el color del recaptcha y a espanol, coloquen esto despues del body html

var RecaptchaOptions = {
theme : 'white', /* tema color blanco */
lang : 'es' /* idioma español */
};

SlimThug
Publicado: 26/06/2010 11:04 pm

gracias unijimpe, funciona perfecto, si ingresan mal la captcha al recargar el formulario con los datos, estos no se pierden, con respecto a lo del color del captcha despues del head html, deben ingresar el codigo que puse arriba adentro de las etiquetas script el codigo que postee mas arriba.

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)