Poner una captcha en PHP en tres pasos

  • Por
Presentamos reCAPTCHA, un servicio de captcha gratuito para integrar fácilmente en cualquier página, en PHP o cualquier otro lenguaje.
Integrar un captcha a un formulario nunca ha sido tan fácil como utilizar reCAPTCHA, un servicio gratuito para implementar un captcha en cualquier sitio web.

Primero habría que decir lo que es un captcha y para qué sirve. Se trata de un sistema para comprobar que un formulario ha sido escrito por un humano y no una máquina. Sirve para evitar que robots, bots o máquinas envíen información a través de los formularios que tenemos en una web. Posiblemente ya sepas lo que es un captcha, pero si quieres más información accede a la FAQ: Qué es una captcha?

En este artículo vamos a mostrar una manera de implementar un captcha en nuestro sitio web PHP en muy pocos y sencillos pasos. Para ello nos vamos a ayudar de un servicio llamado reCAPTCHA, que ofrecen gratis en la web http://recaptcha.net/. Gracias a este servicio podremos olvidarnos de casi toda la complejidad de instalar y configurar la captcha en nuestro servidor y además contar con la seguridad de disponer de una captcha en continua revisión y actualización.

Paso 1: Registrarse en reCAPTCHA

Nos tenemos que dirigir a http://recaptcha.net/ y registrarnos como usuarios. Nos solicitarán unos pocos datos personales para darnos de alta.

Una vez registrados debemos obtener unas claves para utilizar el sistema de captcha. Estas claves son específicas para cada dominio donde quieras utilizarlo. Las claves no son más que una llave pública y otra privada, que utilizaremos luego para poner la captcha en nuestra web.

Son algo como esto:

Public Key: 5LfCABCDEFGHIJUNDSBOejHq-5n5StSWawBpCAMX
Private Key: 6LfCAAAFHJSDFGHHJHDeju3a-Z5lomjShHKaGh9g

Esas claves son, lógicamente, secretas y debemos mantenerlas así. Yo me he inventado estas claves para no mostrar las mias ;)

En el sitio de reCAPTCHA tendremos que descargarnos unos códigos PHP con una librería PHP para poner en nuestro servidor y unos ejemplos de uso del sistema. Esto lo podemos conseguir en el apartado "Resources". Veremos que tienen un plugin o librería para trabajar con PHP, que además está perfectamente documentado.

Una vez descargado el zip que contiene la librería PHP, la tenemos que poner en algún lugar de nuestro servidor. Recuerda luego donde la has puesto, porque tendrás que hacer un include con PHP de esa librería.

Por ejemplo, podríamos colocar dicha librería en el mismo directorio donde está la página PHP que va a hacer uso de ella. Entonces la incluiríamos con algo como esto:

require_once('recaptchalib.php');

Paso 2: Incluir el captcha en el formulario

En la librería descargada ('recaptchalib.php') Hay una función que sirve para mostrar la captcha. Simplemente tenemos que llamarla con los parámetros correctos. La función devuelve el código HTML que tenemos que colocar en la página para que se vea la captcha.

recaptcha_get_html($captcha_publickey, $error_captcha);

Los parámetros que recibe son la llave pública que conseguimos anteriormente y un código de error, que es opcional. Luego veremos de dónde podría venir ese código de error.

El código del formulario sería algo como esto:


<?
require_once('recaptchalib.php');
//Llaves de la captcha
$captcha_publickey = "6LfC?.";
$captcha_privatekey = "6LfC? ";
//por ahora ponemos a null el error de la captcha
$error_captcha=null;
?>

<form action="miejemplo_formulario.php" method="post">
Nombre: <input type="text" name="nombre" size="30">
<br>
Edad: <input type="text" name="edad" size="3">
<br>
<?
//escribimos en la página lo que nos devuelve recaptcha_get_html()
echo recaptcha_get_html($captcha_publickey, $error_captcha);
?>
<br>
<input type="submit" value="Enviar">
</form>

Paso 3: Validar la captcha

Existe otra función para validar la captcha, llamada recaptcha_check_answer(). Esta función recibe también varios parámetros: La llave privada, la IP del usuario, y dos campos que contienen los valores que envía la captcha dentro del formulario $_POST["recaptcha_challenge_field"] y $_POST["recaptcha_response_field"].

Esta función devuelve un objeto que tiene dos propiedades:

is_valid, un boleano para decir si es se ha validado correctamente la captcha. error, un código de error que especifica qué ha ido mal si no se validó correctamente el texto.

Podríamos validar la captcha con algo como esto:


$captcha_respuesta = recaptcha_check_answer ($captcha_privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if ($captcha_respuesta->is_valid) {
   //todo correcto
//hacemos lo que se deba hacer una vez recibido el formulario válido
}else{
   //El código de validación de la imagen está mal escrito.
   $error_captcha = $captcha_respuesta->error;
}

Llamamos a la función recaptcha_check_answer() enviando los parámetros comentados y guardamos el valor devuelto por la función en la variable $captcha_respuesta.

Luego comprobamos si el atributo $captcha_respuesta->is_valid es true. En ese caso sabemos que el texto escrito de la imagen se ha validado correctamente y hacemos lo que haya que hacer en el formulario.

Si $captcha_respuesta->is_valid era falso, entonces quiere decir que no estaba bien escrito el texto de la imagen. Podemos entonces actualizar la variable $error_captcha para que cuando mostremos de nuevo la captcha podamos pasarle el error generado y que avise al usuario.

Tenemos nuestra captcha funcionando!

El código completo de este ejemplo es el siguiente:


<html>
<head>
   <title>Página con formulario protegido por captcha</title>
</head>

<body>
<?
require_once('recaptchalib.php');
//Llaves de la captcha
$captcha_publickey = "6LfC?.";
$captcha_privatekey = "6LfC? ";
$error_captcha=null;

if ($_POST){
   $captcha_respuesta = recaptcha_check_answer ($captcha_privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
   if ($captcha_respuesta->is_valid) {
      //todo correcto
      //hacemos lo que se deba hacer una vez recibido el formulario válido
      echo "Todo correcto!";
   }else{
      //El código de validación de la imagen está mal escrito.
      echo "Has escrito mal el texto";
      $error_captcha = $captcha_respuesta->error;
   }
}
?>

<form action="miejemplo_formulario.php" method="post">
Nombre: <input type="text" name="nombre" size="30">
<br>
Edad: <input type="text" name="edad" size="3">
<br>
<?
//escribimos en la página lo que nos devuelve recaptcha_get_html()
echo recaptcha_get_html($captcha_publickey, $error_captcha);
?>
<br>
<input type="submit" value="Enviar">
</form>

</body>
</html>


El ejemplo se puede ver en una página aparte.

Conclusión

Hemos visto en 3 pasos como hacer un formulario seguro con un captcha, apoyándonos en la tecnología desarrollada por reCAPTCHA. Hemos utilizado PHP para el ejemplo, y lo hemos simplificado al máximo. Aunque hay que señalar que este sistema dispone de un API para poder implementar captchas en otros entornos, incluso con Javascript, y poder personalizar el aspecto del cuadro que solicita introducir el texto de la imagen. También disponen de plugins para integrar reCAPTCHA en aplicaciones web populares como phpBB, MediaWiki o WordPress.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Silvina

05/6/2007
Yo utilizo un sistema gratuito y muy fácil de usar que se llama CeroSpam (www.cerospam.com.ar)
CeroSpam provee un código que hay q copiar dentro del formulario y listo, nada de librerías ni configuraciones raras.
Es realmente muy sencillo para usar y permite administrar varios formularios.
Se los recomiendo.

Claudia

18/9/2007
Hola,

Este artículo ilustra bien los pasos a seguir para implementar el captcha en un formulario. Deseo preguntar si el fondo y el tamaño del captcha es posible modificarlos. Gracias.

Claudia Alexandra.

Links

06/2/2008
Estimado, muchas gracias por el artículo. Estoy probando implementar el reCaptcha en un form que estoy desarrollando y la pregunta es: cómo evito el envío si el codigo introducido no es correcto sin que me dispare la accion "submit" del form?
En este ejemplo entiendo que solo hace 'echo' notidicando al usuario.. pero me envia el form igual.

Gracias de antemano.
links

if ($captcha_respuesta->is_valid) {
//todo correcto
//hacemos lo que se deba hacer una vez recibido el formulario válido
echo "todo ok";
}else{
//El código de validación de la imagen está mal escrito.
echo "Has escrito mal el texto";
$error_captcha = $captcha_respuesta->error;
}
}
?>

Carlos

08/2/2009
Se puede implementar el codigo, y se puede verificar si el codigo esta bien, pero como evitamos que si esta mal no se envie todo el formulario, suponiendo que en metodo Form Action redireccione a otra pagina, igual se va a esta pagina, asi se aya introducido mal el code... alguien que me pueda ayudar..

Adrian Perez

11/3/2009
Ya pude crear una pagina con recaptcha, pero ¿Como hago para vincular el recaptcha con el boton de enviar del formulario?

En el ejemplo que dan, si uno le da click sin meter ningún código, envía de todos modos el formulario.

Carlos

11/6/2009
Solucion a no enviar todo el formulario
Podeís enviarlo por AJAX, validarlo en un php aparte, y si no es correcto no enviarlo

internauta

24/11/2009
Copia de artículo
Hola

No más pasaba para decirte que tu artículo está copiado idénticamente en
http://blog.aplicacionesweb.cl/2007/07/04/poner-una-captcha-en-php-en-tres-pasos/

¡Ni se tomaron la molestia de cambiar el enlace de prueba!

Saludos

Maicro

07/1/2010
Problemas de funcionamiento.
Hola, buenas. Muchas gracia por el tutorial. Soy incapaz de hacer funcionar correctamente la validación reCAPTCHA para el formulario que he hecho, también obtenido de dsarrolloweb. No sé reconocer el fallo porque desconozco la base del lenguaje PHP. Por ello, por favor, necesito una explicación muy clara de lo que debo hacer. Gracias.

El problema es que el formulario se envía sea correcto o incorrecto el texto introducido en el reCAPTCHA.

Creo que el problema reside al intentar incluir el código PHP en un formulario que ya había implementado. Este formulario ya hecho mandaba a una página dando las gracias por el envío, un correo al remitente notificando de la salida del formulario -a esperar de poder validar su funcionamiento con direcciones de correos distintas al dominio donde alojo la página- y otro correo al titular de la página. A su vez, esta nueva página de agradecimiento, también en PHP, a los cuatro segundos volvía a mandar a la página del formulario.

Me imagino que el problema viene de la función que realiza el botón Enviar del formulario, que debe de pegarse con la validación del reCAPTCHA. Los códigos del reCAPTCHA los he sacado de la propia página de reCAPTCHA -que han cambiado-, no del tutorial. Aun así, algo los he personificado y a lo mejor también he errado en ello. En el directorio que aloja el formulario están estos tres archvio:
? contacto.php => El archivo que contiene el formulario y el reCAPTCHA.
? gracias.php => La página donde va el formulario una vez enviado y que a los cuatro segundos vuelve a la página del formulario.
? recaptchalib.php => El archivo original que se obtiene de reCAPTCHA que no he modificado.

Tras el <body> tengo insertado este código para que se visualice la página con el formulario:

<?
if (!$HTTP_POST_VARS){
?>

A continuación pongo el código del archivo PHP que contiene el formulario y reCAPTCHA.

<div id="tablaformulario">
<table summary="Formulario de contacto de Classic Co.">
<form action="contacto.php" method="post">
<tr>
<td>
<label for="nombre">Nombre:</label>
</td>
<td>
<input type="text" name="nombre" id="nombre" size="64" maxlength="60" />
</td>
</tr>
<tr>
<td>
<label for="email">Correo:</label>
</td>
<td>
<input type="text" name="email" size="64" maxlength="60" value="@" />
</td>
</tr>
<tr>
<td valign="top">
<label for="coment">Mensaje:</label>
</td>
<td>
<textarea name="coment" cols="50" rows="6"></textarea>
</td>
</tr>
<tr>
<td>
</td>
<td>
<?
require_once('recaptchalib.php');
//Claves optenidas de http://recaptcha.net/api/getkey
$publickey = "???";
$privatekey = "???";

# the response from reCAPTCHA
$resp = null;
# the error code from reCAPTCHA, if any
$error = null;

# was there a reCAPTCHA response?
if ($_POST["recaptcha_response_field"]) {
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);

if ($resp->is_valid) {
//Si es correcto hacemos lo que se deba hacer una vez recibido el formulario válido
echo "Todo correcto";
} else {
//El código de validación de la imagen está mal escrito.
echo "Has escrito mal el texto";
$error = $resp->error;
}
}
echo recaptcha_get_html($publickey, $error);
?>
</td>
</tr>
<tr>
<td>
<input type="submit" value="Enviar" class="botonformulario" />
</td>
<td>
<input type="reset" value="Borrar" class="botonformulario" />
</td>
</tr>
</form>
<?
}else{
//Cuerpo del mensaje que recibe el dueño de la pagina
$cuerpo = "El formulario enviado es el siguiente. ";
$cuerpo .= "Nombre del remitente: " . $HTTP_POST_VARS["nombre"] . " ";
$cuerpo .= "Dirección de correo del remitente: " . $HTTP_POST_VARS["email"] . " ";
$cuerpo .= "Mensaje escrito: " . $HTTP_POST_VARS["coment"] . " ";
$remitente = $HTTP_POST_VARS["email"];

//Mando el correo al dueño de la pagina
$cabeceras = "From: $remitente Reply-To: $remitente ";
mail("maicro@maicro.es","Formulario enviado desde la página web",$cuerpo,$cabeceras);

//Mando la notificacion de envio al remitente. OJO, el servidor debe permitir enviar mensajes a otros dominios.
$respuesta = 'En Classic Co. hemos recibido tu formulario de contacto. En breve nos pondremos en contacto contigo. Gracias. Saludos.' ;
mail($remitente,"Formulario recibido en Classic Co.",$cuerpo,$respuesta);

//Redirecciono para dar las gracias por el envío
print "<meta http-equiv=Refresh content="0 ; url=gracias.php">";
}
?>
</table>
</div>

Muchas gracias por la ayuda. Decir que la realización de esta página es un favor para un gran y apreciado amigo. No le cobro por ello. Saludos.

neojag

07/5/2010
y para sitios con https
utilize recapcha para un sitio en https pero funciona bien con MF pero con IE sale una fea alerta en la que dice qe se tiene contenido no seguro. y este es la capcha. que solucion se puede dar a si?!

de antemano gracias

martin

19/5/2010
pude colocar el captcha en mi pagina pero no funciona
HOla...no soy experto en el tema, pero me anime a intentar insertar un generador de Captcha en mi libro de visitas. El problema que tengo es que el formulario se envia aunque el codigo que ingrese al captcha sea o no correctos...ocea que el captcha no filtra nada.....AYUDA!!!

El archivo principal es "index.php":
-------------------------------------

<?
//conecto con la base de datos
$conn = mysql_connect("localhost","xxxxxxxx","xxxxxxxx");
mysql_select_db("xxxxxxxxxx",$conn);


if (!$HTTP_POST_VARS)
{
//si no recibo nada por el formulario de firma del libro, muestro las firmas del libro
//construyo la sentencia SQL
$ssql = "SELECT * FROM librovisitas_php";

//se mostrar&aacute;n las &uacute;ltimas fimas, aunque habr&aacute; un enlace en la parte de abajo que se podr&aacute; pulsar para ver m&aacute;s firmas
if (isset($_GET["vermas"]))
$ssql .= " where id_librovisitas_php<=" . $vermas;

//ordeno la sentencia y limito el numero de resultados
$ssql .= " ORDER BY id_librovisitas_php desc limit 11";

//tomo el juego de resultados
$resultid = mysql_query($ssql,$conn);
?>
<!--libro 01 -->
<?
//muestro los datos en un bucle
$num_filas = 0;
while (($damefila=mysql_fetch_object($resultid)) && ($num_filas<20))
{
?>
</p>
<p><b><span class="verde2">»</span></b>
<!--libro 02 -->
<span class="gris2">
<? //si el visitante no introdujo nombre muestro como nombre "An&oacute;nimo"
if ($damefila->nombre == "-"){
echo "An&oacute;nimo";
}elseif ($damefila->email != "-") {
echo '<a href="mailto:' . $damefila->email . '">' . $damefila->nombre . '</a>';
}else{
echo $damefila->nombre;
}
?>
</span>
<!--libro 03 -->
</p>
<p><b><span class="blanco">-</span></b> <?echo strip_tags($damefila->comentario)?> </p>
<div class="coments"></div>
<p>
<!--libro 04 -->
<?
$num_filas++;
} //termina el bucle while

//si quedan m&aacute;s valoraciones en el conjunto de resultados, muestro el enlace de "Ver m&aacute;s"
if ($damefila)
echo "<div align=center><b><a href="index.php?vermas=$damefila->id_librovisitas_php">Ver m&aacute;s mensajes</a></b></div><br>";

//libero el conjunto de resultados
mysql_free_result($resultid);

//incluyo el formulario para firmar
include ("formul_mensaje.php");
}
else
{
//estoy recibiendo datos del fomulario de firmas
//Formateamos un poco el formulario, por si acaso los datos son incorrectos

//eliminamos las etiquetas HTML y PHP de las cadenas de texto
$nombre = strip_tags($_POST["nombre"]);
$email = strip_tags($_POST["email"]);
$comentario = strip_tags($_POST["comentario"]);

//Cortamos las cadenas demasiado largas
$nombre=substr($nombre,0,150);
$email=substr($email,0,80);

//Comprobamos que el visitante se ha molestado en rellenar algo
if (strlen($nombre)==0 and strlen($email)==0 and strlen($comentario)==0)
{
?>
<!--libro 05 -->
</p>
<p><b>Gracias por el env&iacute;o</b>.<br />
<br />
Te agradecer&iacute;a, no obstante y si no resulta mucho esfuerzo, que rellenes alguno de los campos para dejar constancia de tu visita.</p>
<?
}else{
//si alguno de los campos falta prefiero colocar un gui&oacute;n o "sin comentarios"
if (!$nombre)$nombre="-";
if (!$email) $email="-";
if (!$comentario) $comentario="Sin comentarios";

//Generamos la ssql e insertamos el registro
$ssql = "INSERT INTO librovisitas_php (nombre,email,comentario) VALUES ('" . $nombre . "','" . $email . "','" . $comentario . "')";
//echo $ssql . "<p>";
mysql_query($ssql,$conn);
?>
<!--libro 06 -->
<?
}
?>
<!--libro 07 -->
<a href="." class="Estilo1">Volver al libro de visitas</a>
<?
}

mysql_close($conn);
?>


y aparte tengo el archivo del formulario, en donde puse el generador captcha llamado "formul_mensaje.php":
------------------------------------------------------------------------------------------


<form name=librovisitas action="index.php" method="post">
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<td class=titcol>&nbsp;<b>Firma el Libro de Visitas</b></td>
</tr>
<tr>
<td class=fuente8>&nbsp;Dejame tu mensaje en el libro de visitas.
<br>
<br>
</td>
</tr>
<tr>
<td>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<td class=fuente8 align="center">
Nombre
<br>
<input type="Text" name="nombre" size="20" maxlength="150">
<br>
<br>
Email
<br>
<input type="Text" name="email" size="20" maxlength="100">
<br>
</td>
<td ALIGN=CENTER class=fuente8 valign="middle">
Comentarios:
<br>
<textarea name="comentario" cols="30" rows="7"></textarea>
</td>
</tr>
<tr>
<td colspan=2 align=center class=fuente8>
<br>
<?php

require_once('recaptchalib.php');

// Get a key from http://recaptcha.net/api/getkey
$publickey = "6Le_XXXXXXXXXX";
$privatekey = "6Le_XXXXXXXXX";

# the response from reCAPTCHA
$resp = null;
# the error code from reCAPTCHA, if any
$error = null;

# was there a reCAPTCHA response?
if ($_POST["recaptcha_response_field"]) {
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);

if ($resp->is_valid) {
echo "You got it!";
} else {
# set the error code so that we can display it
$error = $resp->error;
}
}
echo recaptcha_get_html($publickey, $error);
?>
<input type="submit" value=" Enviar la firma al libro de visitas ">
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>


---------------------------------------------------------------------------------
en donde tengo el error???

este el el link en donde tengo el libro de visitas:
http://www.martingilardi.com.ar/mg/index.php

gracias

diego

15/7/2010
captcha en local?
Hola buenas tardes, el tuto esta excelente, pero mi pregunta ahora es...
Como puedo yo utilizar el captcha pero en local?
Es decir, yo tengo un sistemita hecho en php, pero corre unicamamente en mi maquina, es decir que no lo tengo puesto en ningun servidor
Lo corro con el XAMPP
En la pagina del recaptcha me pide un dominio si o si, entonces..
Se puede utilizar en local o no?
y en el caso de que se pueda, como seria?
Gracias de todos modos..

vitsuba

15/7/2010
captcha en local???
Hola que tal, mi pregunta es si se puede utilizar el captcha pero en local
Tengo un pequeño sistema hecho en php que realiza altas y bajas. Dicho sistema lo corro con el apache en mi maquina, pero el mismo no esta en ningun servidor online por asi decirlo...
ahi alguna forma ya que cuando voy a la pagina de recaptcha me pide que ponga la direccion de mi web y como no tengo eso no me deja seguri adelante..

Me gustaria que me den alguna sugerencia al respecto..

Gracias desde ya..

Diego

rousse

26/5/2011
duda!!
como puedo hacer que al validar la palabra, en lugar de que aparesca el texto de "correcto!" me abra una nueva ventana en php???

jorge

05/9/2011
SE PUEDE PODER UN ESTILO A UN TEXTO ECHO PHP
SE PUEDE PODER UN ESTILO A UN TEXTO ECHO PHP, SI ALGUIEN SABE LA FORMA LO PUBLIQUE, GRACIAS

Douglas Galvis

06/9/2011
EXCELENTE MATERIAL FELICITACIONES
DE VERDAD ME ENCANTO BASTANTE EL EJEMPLO DE AUTENTICACION DE HECHO LO COLOQUE EN E
UN EJEMPLO QUE SE ENCUANTRA EN http://registrate.net16.net/codigos/index.php
PUEDEN PROBARLO:

usuario: galvis clave: 123 los lleva al administrador
usuario: maria clave: 777 los lleva a una pag de usuarios

Muchas gracias por el aporte

thejimmyx

04/11/2011
Insertar Recaptcha en mi formulario de registro
Hola amigos estuve asiendo todo, y al final el recaptcha no funciona osea que puedes poner cualkier letra y no detecta si es incorrecto.

Me ayudan pliz este es el codigo de mi formulario:

<?php
// Copyright © 2010, Delife
// Desarrollador: IsmaelTorres - (ismaelth_94@hotmail.com)

$titulo = 'Registrarse';
require_once('cabecera.php');
require_once('mantenimiento.php');
$conexion=mysql_connect($sql_server,$sql_user,$sql_pass)
or die("Problemas en la conexion");
mysql_select_db($sql_db,$conexion) or
die("Problemas en la seleccion de la base de datos");
if(isset($_GET['accion']))
{
if($_GET['accion'] == 'registrar')
{
if(isset($_POST['nick']))
{
if(isset($_POST['pass']))
{
if(isset($_POST['email']))
{
$email=str_replace("'","&#39;",$_POST['email']);
$consultaemail = mysql_query("SELECT email FROM usuarios WHERE email='$email'" );
$email_existe = mysql_num_rows($consultaemail);
if ($email_existe>0)
{
?>
<div class="caja5">
<div style="margin-top:10px;margin-bottom:10px;margin-left:10px;margin-right:10px;">
<div class="tituloizq"><a href="javascript:animatedcollapse.toggle('ccl')" style="text-decoration:none;color:#fff;"><img border="0" src="<?php echo $theme_dir; ?>/images/botoncito.png" /></a></div>
<div class="tituloder">&nbsp;&nbsp;</div>
<div class="titulo">&nbsp;&nbsp;Listo!</div>
<div id="ccl" class="redondeado" style="background-image:url(<?php echo $theme_dir; ?>/images/transparencia2.png);padding:2%;">
<br />
<h3>Ya hay un usuario registrado con ese email. Vuelve atr&aacute;s y escoje otro.</h3>
<br /><br />
</div>
</div>
</div>
<?php
}
else
{
if(isset($_POST['sexo']))
{
$nick=str_replace("'","&#39;",$_POST['nick']);
$consultanick = mysql_query("SELECT nick FROM usuarios WHERE nick='$nick'" );
$user_existe = mysql_num_rows($consultanick);
if ($user_existe>0)
{
?>
<div class="caja5">
<div style="margin-top:10px;margin-bottom:10px;margin-left:10px;margin-right:10px;">
<div class="tituloizq"><a href="javascript:animatedcollapse.toggle('ccl')" style="text-decoration:none;color:#fff;"><img border="0" src="<?php echo $theme_dir; ?>/images/botoncito.png" /></a></div>
<div class="tituloder">&nbsp;&nbsp;</div>
<div class="titulo">&nbsp;&nbsp;Listo!</div>
<div id="ccl" class="redondeado" style="background-image:url(<?php echo $theme_dir; ?>/images/transparencia2.png);padding:2%;">
<br />
<h3>Este nombre de usuario ya esta en uso. Vuelve atr&aacute;s y escoje otro.</h3>
<br /><br />
</div>
</div>
</div>
<?php
}
else
{
if(strlen($_POST['nick']) <= 4)
{
?>
<div class="caja5">
<div style="margin-top:10px;margin-bottom:10px;margin-left:10px;margin-right:10px;">
<div class="tituloizq"><a href="javascript:animatedcollapse.toggle('ccl')" style="text-decoration:none;color:#fff;"><img border="0" src="<?php echo $theme_dir; ?>/images/botoncito.png" /></a></div>
<div class="tituloder">&nbsp;&nbsp;</div>
<div class="titulo">&nbsp;&nbsp;Listo!</div>
<div id="ccl" class="redondeado" style="background-image:url(<?php echo $theme_dir; ?>/images/transparencia2.png);padding:2%;">
<h3>El nick debe tener como m&iacute;nimo 5 caracteres.</h3>
<br /><br />
</div>
</div>
</div>
<?php
}
elseif(strlen($_POST['nick']) >= 21)
{
?>
<div class="caja5">
<div style="margin-top:10px;margin-bottom:10px;margin-left:10px;margin-right:10px;">
<div class="tituloizq"><a href="javascript:animatedcollapse.toggle('ccl')" style="text-decoration:none;color:#fff;"><img border="0" src="<?php echo $theme_dir; ?>/images/botoncito.png" /></a></div>
<div class="tituloder">&nbsp;&nbsp;</div>
<div class="titulo">&nbsp;&nbsp;Listo!</div>
<div id="ccl" class="redondeado" style="background-image:url(<?php echo $theme_dir; ?>/images/transparencia2.png);padding:2%;">
<h3>El nick puede tener como m&aacute;ximo 20 caracteres.</h3>
<br /><br />
</div>
</div>
</div>
<?php
}
else
{
$fecha = date("Y-m-d");
$nick = str_replace("'","&#39;",$_POST[nick]);
$pass = str_replace("'","&#39;",$_POST[pass]);
$email = str_replace("'","&#39;",$_POST[email]);
$avatar = str_replace("'","&#39;",$_POST[avatar]);
$sexo = str_replace("'","&#39;",$_POST[sexo]);
mysql_query("insert into usuarios(nick,pass,email,avatar,sexo,fechaalta,imagenes,puntos,banneado,comentarios,posts,mensajes,rango,ip) values
('$nick','$pass','$email','$avatar','$sexo','$fecha','0','50','no','0','0','0','usuario','$_SERVER[REMOTE_ADDR]')",
$conexion) or die("Problemas en el select".mysql_error());
?>
<div class="caja5">
<div style="margin-top:10px;margin-bottom:10px;margin-left:10px;margin-right:10px;">
<div class="tituloizq"><a href="javascript:animatedcollapse.toggle('ccl')" style="text-decoration:none;color:#fff;"><img border="0" src="<?php echo $theme_dir; ?>/images/botoncito.png" /></a></div>
<div class="tituloder">&nbsp;&nbsp;</div>
<div class="titulo">&nbsp;&nbsp;Listo!</div>
<div id="ccl" class="redondeado" style="background-image:url(<?php echo $theme_dir; ?>/images/transparencia2.png);padding:2%;">
<h3>Registro realizado con &eacute;xito! Ya puedes iniciar sesi&oacute;n</h3>
<br /><br />
</div>
</div>
</div>
<?php
}
}
}
else
{
?>
<div class="caja5">
<div style="margin-top:10px;margin-bottom:10px;margin-left:10px;margin-right:10px;">
<div class="tituloizq"><a href="javascript:animatedcollapse.toggle('ccl')" style="text-decoration:none;color:#fff;"><img border="0" src="<?php echo $theme_dir; ?>/images/botoncito.png" /></a></div>
<div class="tituloder">&nbsp;&nbsp;</div>
<div class="titulo">&nbsp;&nbsp;Listo!</div>
<div id="ccl" class="redondeado" style="background-image:url(<?php echo $theme_dir; ?>/images/transparencia2.png);padding:2%;">
<h3>Debes elegir un sexo.</h3>
<br /><br />
</div>
</div>
</div>
<?php
}
}
}
else
{
?>
<div class="caja5">
<div style="margin-top:10px;margin-bottom:10px;margin-left:10px;margin-right:10px;">
<div class="tituloizq"><a href="javascript:animatedcollapse.toggle('ccl')" style="text-decoration:none;color:#fff;"><img border="0" src="<?php echo $theme_dir; ?>/images/botoncito.png" /></a></div>
<div class="tituloder">&nbsp;&nbsp;</div>
<div class="titulo">&nbsp;&nbsp;Listo!</div>
<div id="ccl" class="redondeado" style="background-image:url(<?php echo $theme_dir; ?>/images/transparencia2.png);padding:2%;">
<h3>Debes escribir un email.</h3>
<br /><br />
</div>
</div>
</div>
<?php
}
}
else
{
?>
<div class="caja5">
<div style="margin-top:10px;margin-bottom:10px;margin-left:10px;margin-right:10px;">
<div class="tituloizq"><a href="javascript:animatedcollapse.toggle('ccl')" style="text-decoration:none;color:#fff;"><img border="0" src="<?php echo $theme_dir; ?>/images/botoncito.png" /></a></div>
<div class="tituloder">&nbsp;&nbsp;</div>
<div class="titulo">&nbsp;&nbsp;Listo!</div>
<div id="ccl" class="redondeado" style="background-image:url(<?php echo $theme_dir; ?>/images/transparencia2.png);padding:2%;">
<h3>Debes escribir una contrase&ntilde;a.</h3>
<br /><br />
</div>
</div>
</div>
<?php
}
}
else
{
?>
<div class="caja5">
<div style="margin-top:10px;margin-bottom:10px;margin-left:10px;margin-right:10px;">
<div class="tituloizq"><a href="javascript:animatedcollapse.toggle('ccl')" style="text-decoration:none;color:#fff;"><img border="0" src="<?php echo $theme_dir; ?>/images/botoncito.png" /></a></div>
<div class="tituloder">&nbsp;&nbsp;</div>
<div class="titulo">&nbsp;&nbsp;Listo!</div>
<div id="ccl" class="redondeado" style="background-image:url(<?php echo $theme_dir; ?>/images/transparencia2.png);padding:2%;">
<h3>Debes escribir un nick.</h3>
<br /><br />
</div>
</div>
</div>
<?php
}
}
}
else
{
?>
<div class="caja5">
<div style="margin-top:10px;margin-bottom:10px;margin-left:10px;margin-right:10px;">
<div class="tituloizq"><a href="javascript:animatedcollapse.toggle('ccl')" style="text-decoration:none;color:#fff;"><img border="0" src="<?php echo $theme_dir; ?>/images/botoncito.png" /></a></div>
<div class="tituloder">&nbsp;&nbsp;</div>
<div class="titulo">&nbsp;&nbsp;Registrarse</div>
<div id="ccl" class="redondeado" style="background-image:url(<?php echo $theme_dir; ?>/images/transparencia2.png);padding:2%;">
<form action="?accion=registrar" method="post">
Nick:&nbsp;&nbsp;<input size="27" type="text" name="nick"><br /><br />
Contraseña:&nbsp;&nbsp;<input size="20" type="password" name="pass"><br /><br />
Email:&nbsp;&nbsp;<input size="26" type="text" name="email"><br /><br />
Avatar:&nbsp;&nbsp;<input size="25" type="text" name="avatar"><br /><br />
Sexo:&nbsp;&nbsp; <input type="radio" name="sexo" value="mas">Hombre
&nbsp;&nbsp; <input type="radio" name="sexo" value="fem">Mujer
<br /><br />
<input class="boton" type="submit" value="Registrarse">
<br /><br />
</form>
</div>
</div>
</div>
<?php
}
require_once('abajo.php');
?>

merieno

16/11/2011
Una pregunta...
Tu key no es 6LfyAAAAAAAAAF0VWWY44XYNQBVlhhzu73sWbfrQ

Que es lo que no hay que mostrar, o ocultar y como puedo hacerlo.?

Saludos

miguel

17/1/2012
poner captcha
Estoy tratando de hacer lo que indica en el articulo, pero tengo error.

Notice: Undefined index: recaptcha_challenge_field in C:xampphtdocscontactform1miejemplo_formulario.php on line 20

Notice: Undefined index: recaptcha_response_field in C:xampphtdocscontactform1miejemplo_formulario.php on line 21
Has escrito mal el texto
Nombre:
Edad:

Input error: k: Format of site key was invalid (esto lo entiendo porque hago la prueba en un localhost)

Gracias por la ayuda

patricia

14/6/2012
Cómo pongo el mensaje de error en el propio cuadro del capcha
Hola. Muchas gracias por el tutorial. La cosa es que sigo todos los pasos, y me funciona bien, pero el mensaje de que el captcha esta mal me sale en una página aparte, y es muy incomodo. ¿Cómo hago para que me salga en el propio cuadro cómo en el del ejemplo que pones?

Muchisimas gracias!

jsahara

27/7/2012
error en el mismo formulario
<?php
claves
function fmcaptcha(){........

if ($captcha_respuesta->is_valid) {

//todo correcto
//hacemos lo que se deba hacer una vez recibido el formulario válido
echo "Todo correcto!";
return 1;
}else{
//El código de validación de la imagen está mal escrito.
echo "Has escrito mal el texto";
$error_captcha = $captcha_respuesta->error;
return 0;
}

}//fin fmcaptcha
$txt_act=fmcaptcha();
if($txt_act==1){
hacer algo
}
......
?>
<form method="POST" action="formulario.php">
<? if($txt_act==0){echo 'Error tiene que rellenar la captcha';}
?>
<?
//escribimos en la página lo que nos devuelve recaptcha_get_html()
echo recaptcha_get_html($captcha_publickey, $error_captcha);
?>

alfredo

02/10/2012
captcha
excelente tu tutorial, pero quiero hacerte una pregunta,,, al colocar el captcha con la funcion validar captcha,,, realiza la funcion antes descrita, pero no se conecta con la base de datos en el servidor, que es la funcion principal del formulario... Que debo hacer

hramos_net

08/3/2013
Validar Captcha
Buen día a todos, agradezco por anticipado la ayuda que me puedan dar.
Tengo una pagina form.php en el que tengo los controles del formulario que necesito, he incluido el captcha, se muestra bien. El envío de los datos a un correo electrónico lo hago desde otra página envio.php, donde recoge con $POST los valores de la pagina form.php, entonces no se donde hacer la validación del CAPTCHA y cual es la variable que genera para cargarlo con $POST en mi archivo envio.php.

Quizas sea hacerlo todo en una sola página¿? formulario y envío¿?

Quedo a la espera de sus respuestas...

nayib quessep

08/6/2013
mensaje de error
Yo sigo las instrucciones como se describe en la pagina pero me sale un mensaje de error que dice:
recaptcha_response_field no esta definido y muestra el archivo y la linea donde esta el error

josemanuelprz24

04/7/2013
Catpcha
Hola, mi duda es sobre un catcha en un formulario eh intentado miles de cosas y ninguna cosa me ha funcionada para validar un formulario y procesarlo medienate php con el codigo del la imagen catpcha incluida, alguien sabe como le puedo hacer?

<?php
include 'config.php';
$nombre = $_POST['nombre'];
$correo = $_POST['correo'];
$ciudad = $_POST['ciudad'];
$telefono = $_POST['telefono'];
$mensaje = $_POST['mensaje'];
$subject = "Contacto";
$UN_SALTO = " ";
$message = "Nombre: ". $nombre . $UN_SALTO ."Correo: ".$correo . $UN_SALTO ."Teléfono: ".$telefono . $UN_SALTO ."Ciudad: ".$ciudad . $UN_SALTO ."Mensaje: ".$mensaje;


/*the $header variable is for the additional headers in the mail function,
we are asigning 2 values, first one is FROM and the second one is REPLY-TO.
That way when we want to reply the email gmail(or yahoo or hotmail...) will know
who are we replying to. */



if(mail($email_to, $subject, $message, $headers)){
echo 'Su Mensaje ha sido enviado con exito, Gracias Por Contactarnos'; // we are sending this text to the ajax request telling it that the mail is sent..
}else{
echo 'failed';// ... or this one to tell it that it wasn't sent
}


Este es el codigo para procesar el formulario pero falta el catpcha

Makulikurkin

27/5/2014
Problemas al enviar datos
Antes de empezar darte las gracias por todo el contenido de esta web.

Mi problema es el siguiente:

Tengo un formulario que al darle al summit hace un insert en una base de datos y todo me va bien hasta que le meto el codigo del captcha que me hace las insert vacias me guarda una fila en blanco en la base de datos
desconozco por que sera

Muchas gracias.

lorea

06/8/2014
no me funciona
He hecho paso a paso, copiando cada línea de código, he sustituido los keys, por los mios y nada.
Ni tan siquiera consigo que me entre al if:

if ($_POST){
$captcha_respuesta = recaptcha_check_answer ($captcha_privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if ($captcha_respuesta->is_valid) {
//todo correcto
echo("funciona!");
}else{
//El código de validación de la imagen está mal escrito.
echo "Has escrito mal el texto";
}
}

Vamos, que no me aparece ni funciona ni has escrito mal el texto.

pepe

15/9/2014
pepe
pepe epeppepepepepeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

pepe

15/9/2014
PEPE EL GRANDE
PEPE EL GRANDE

añfhlasf

20/4/2015
Impresionante forma de hacer un captcha
Me parece una mierda como lo ves

jaddada

28/4/2015
aadadad
a aadadad aadadad aadadad

Rafa

03/8/2016
Clave secreta de recaptcha cambia sola en la web de google
Hola buenas tengo una duda con el reCAPTCHA. Tengo creada muchas paginas con su formulario y su recapcha de google y en algunas cuando pasa un tiempo la clave secreta del recapcha se cambia sola en la pagina de creacion de recapcha de google y por consiguiente el formulario de la web deja de funcionar. Tengo que mirar la clave secreta k se ha generado sola en la web de recapcha y modificarla en mi codigo para que vuelva a funcionar el formulario.

Sabe alguien si la clave secreta de los reCAPTCHA caducan cada cierto tiempo??? Si es así hay algún porque y alguna manera de que no pase o me lo notifiquen?¿?¿

Muchas gracias de antemano.

Juanjo Suárez Rodríguez

28/4/2017
Cómo genero un sistema captcha en google form
Hola Miguel Ángel.
Quizás puedas ayudarme. HE generado una encuesta en Google Form de Drive para recibir opiniones que me sirvan para la redacción de un proyecto concreto. Acabo de darme cuenta que han entrado de golpe muchas respuestas y he detectado que todas, con las mismas respuestas. Creo que tiene toda la pinta de un robot. ¿Se puede generar algún control de estos robots editando la encuesta ya diseñada y enviada? ¿Cómo puedo hacerlo? (no tengo conocimientos de informática, sólo soy usuario de office y otras herramientas de trabajo "normal").
Muchísimas gracias. Un cordial saludo.