Utilizar reCAPTCHA con PHP

Este artículo ya se encuentra obsoleto.
Para una referencia actual leer: Proteger formularios del SPAM utilizando reCAPTCHA v2

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.

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

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

<form method="post">
   <label for="username">Usuario</label><br />
   <input name="username" type="text" class="casilla" id="username" /><br />
   <label for="usermail">Email</label><br />
   <input name="usermail" type="text" class="casilla" id="usermail" /><br />
   <label for="usercheck">Verificaci&oacute;n</label><br />
   <?php echo recaptcha_get_html($publickey, $error); ?>
   <input type="hidden" name="action" value="register" />
    <input type="submit" name="btsend" value="Enviar" />
</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.

if ($_POST['action'] == "register") {
   $re_ip = $_SERVER["REMOTE_ADDR"];
   $re_challenge = $_POST["recaptcha_challenge_field"];
   $re_response = $_POST["recaptcha_response_field"];	
   $re_valid = recaptcha_check_answer($privatekey, $re_ip, $re_challenge, $re_response);
	
   if ($re_valid->is_valid) {
      // procesar registro
   } else {
      $error = $resp->error;
   }
}

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.

[download id=»33″ autop=»false»]

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 27 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.

Lesly
Publicado: 10/09/2010 11:54 am

Hola, he implemente mi captcha y todo funciona muy bien, el inconveniente es que cuando introduzco un código incorrecto me muestra la ventana en blanco, donde lo que se quiere es que informe al usuario que ha introducido el código de forma incorrecta que vuelva a intentar enviar su comentario. La pregunta es: como logro que aparezca este mensaje? Agradezco la ayuda que puedan brindar para solucionar este. Gracias!

Juanjo
Publicado: 28/10/2010 7:46 am

Buenas tardes Lesly,

si utilizas http://bassistance.de/jquery-plugins/jquery-plugin-validation/ para la validación del formulario, simplemente añade:

,rules: {
recaptcha_response_field: "required"
}
,messages: {
recaptcha_response_field: "Por favor introduzca el código"
}

Tonimito
Publicado: 19/12/2010 2:41 pm

Gracias, una vez más, unijimpe!
la verdad es que es fantastico!
Tan sólo un par de dudas:
1 – Veo que el artículo es del año 2007. ¿Aún es fiable este sistema? No lo leen los robots OCR?
2 – ¿Se puede definir una fuente determinada? ¿como?

Gracias y un saludo!

Tonimito
Publicado: 19/12/2010 2:44 pm

Perdonad, tenía varaias páginas abiertas y en realidad quería publicar mi comentario en la página: http://blog.unijimpe.net/crear-captcha-con-php/

disculpad las molestias!

George
Publicado: 18/01/2011 2:41 pm

Disculpa la pregunta, pero más que todo no es para un sitio sino personal, tengo ya como 20 días que no he podido ver la imagen de verificación de re-captcha en ninguna página, todas las páginas que abro que lo requieren nunca me muestran la imagen y por ende no me dejan registrar o hacer multiples tareas que ameriten este sistema…

Mi pregunta vendría siendo si es que hay que tener algo más habilitado en el computador de uno para poder verlas?

Es tanto que no veo ni la imagen de verificación del ejemplo que sale en el post inicial…

tech
Publicado: 21/02/2011 10:26 pm

El recaptcha es hasta ahora la mejor arma en contra del spam, muy util gracias por el tuto.

Pepe
Publicado: 01/03/2011 12:03 pm

Muy buen aporte… pero kisiera saber como valido los datos del formulario como son usuario y email con el mismo boton q valida el captcha…

Patricio
Publicado: 18/06/2011 10:37 am

Mira una consulta, tengo varias paginas web, es necesario crear una cuenta para cada una, o solo insertando el código que me dieron la primera vez lo puedo colocar en las demás paginas.?

Gracias.

unijimpe
Publicado: 18/06/2011 11:39 am

Hola Patricio, el código que te han dado lo puedes utilizar todas las veces que quieras en las diferentes páginas de tu web o incluso en diferentes páginas webs, no es necesario registrarse varias veces ni tampoco generar el código varias veces.

Tincho
Publicado: 23/08/2011 1:29 pm

Excelente! Gracias por la info, me sirvió!

Carlos
Publicado: 30/08/2011 10:16 am

Hola Unijimpe..
tengo una duda, yo no uso xamp, ni apache, ni esas cosas
(lo digo porqe vi eso en otras guias tambien)

Uso un hosting normal, y tengo una pagina web de musica
He recibido estos ataques DOS constantemente, y no he podido solucionarlo.
Me dijeron que puedo evitarlo con un Captcha como este, pero mi duda es

Como puedo yo usarlo en mi pagina web de musica (escuchar musica)
Es necesario que salga el Captcha siempre al ingresar a la pagina?

Sera posible hacer qe.. si un zombie hace demasiadas visitas a mi web, que le aparesca dicho CAPTCHA.. osea qe el captcha aparesca SOLO SI existen muchas visitas por dicha IP.

He visto tambien que dan soluciones usando el htaccess, y pues no me han funcionado, he tratado de Negar acceso a algunas IP atakantes pero luego cambian.

Talves aya otra solucion mucho mejor, la verdad no lo se, quisiera que me brindes ayuda con esto de los Zombies.
Espero tu respuesta,
Gracias Unijimpe

jorge
Publicado: 04/09/2011 9:17 pm

Buen Dia a todos Uds.
Desearia agregar la funcionalidad de que pinte,
un mensaje de error en el momento que se ingrese el texto de forma incorrecta, espero una pronta respuesta.

un cordial saludo..
Jorge

Nacho
Publicado: 18/05/2012 10:42 am

Hola, Creo que el ejemplo tiene un error, no funcional pero si bastante importante.
En la linea 10 del ultimo codigo dice esto:
$error = $resp->error;
Mientras deberia decir esto:

$error=$re_valid->error;

En ningun momento se define la variable $resp
La correcta es $re_valid

Enrique Ardavin
Publicado: 19/05/2012 8:53 pm

tengo el problema que envio datos a otra pagina para guardar en una base de datos, el problema es que cuando escribo
no me hace la validacion del captcha cuando tiene el action, como puedo solucionar? gracias.

Enrique Ardavin
Publicado: 20/05/2012 12:09 am

en el anterior comentario no salio lo que estaba planteando, si coloco un action en mi form, no valida y no valida el recaptcha

 

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>)