En este tutorial haremos una función en PHP que generara una seria de letras y números elegidos de manera aleatoria y las plasmara en una imagen, para luego en un formulario hacer la comparación de la imagen generada con lo que el usuario vea e ingrese.
Los códigos captcha empezaron a utilizare en el año 2000 para evitar que los robots puedan registrarse en cuentas de correo electrónicos, foros, portales o participar en encuestas, que solo el humano puede hacerlo.
Vamos a trabajar con dos archivos, captcha.php e index.php en el primero se generara la imagen aleatoria y en el segundo se comparara la imagen generada con lo que el usuario ingrese en la caja de texto:
1. captcha.php
Iniciamos session y creamos una función que generara los números y letras aleatorios.
Luego en $cadena declaramos los números y letras para que la imagen generada obtenga su contenido.
Después en un for generamos la cadena de números/letras de manera aleatoria con la función rand.
<?php
session_start();
function texto($ancho)
{
$cadena = "0123456789abcdefghijkmnñlopqrstwxyz";
for($i = 0; $i<$ancho;$i++)
{
$muestra .= $cadena{rand(0,35)};
}
return $muestra;
}
Ahora creamos una variable de session que nos permita guardar el texto que se utilizara en el captcha, donde llamaremos la funcion texto() creada anteriormente, tambien debemos definir una imagen de fondo donde se plasmara el texto generado.
// Define el ancho del texto usando un parametro (5) para la función creada anteriormente.
$_SESSION['captcha'] = texto(5);
// La imagen gif de fondo.
$captcha = imagecreatefromgif("imagen.GIF");
// La localizacion de la imagen, lo dejamos en 0,0,0
$letras = imagecolorallocate($captcha,0,0,0);
// Unir el texto en la imagen gif creada.
imagestring($captcha,5,16,7,$_SESSION['captcha'],$letras);
// Pone la imagen en cabezera.
header("Content-type: image/gif");
// Muestra la imagen.
imagegif($captcha);
?>
2. index.php
Ahora creamos el formulario donde colocaremos la imagen del captcha con un campo de texto donde se ingresa el texto y se compara con la variable de session que se creó en que parte de arriba, la imagen se coloca de la manera siguiente.
Primero colocamos el código PHP, iniciamos sesión y declaramos $code que es el valor de lo que se ingrese en la caja de texto del formulario que haremos a continuación.
Luego preguntamos si se presiono o no el boton de enviar, dentro de este if hacemos otro if donde comparamos el valor de la variable de sesión con el valor de lo que el usuario ingreso en la caja de texto y mostramos las respuestas correspondientes.
<?php
session_start();
$code = trim($_POST['code']);
if(isset($_POST['save']))
{
if($_SESSION['captcha'] == $code)
{
echo "<span style='color:green'>Es correcto el captcha ingresado</span>";
}
else
{
echo "<span style='color:red'>Es incorrecto el captcha ingresado</span>";
}
}
?>
Ahora creamos el formulario, prestad atención a la etiqueta img donde en src llamamos al archivo captcha.php que creamos al principio.
<form name="form1" method="post" action="">
<img src="captcha.php" width="100" height="30" vspace="3"><br />
<input name="code" type="text"/><br />
<input type="submit" name="save" value="Enviar"><br />
</form>
novato dice
Hola Edwind, en tu ejemplo el formulario no tiene una accion ligada a un archivo externo, de forma que la validación se hace en el mismo archivo al hacer click, pero que pasa si tienes que llamar a un archivo externo, cómo se hace la validación antes de llamar al archivo ?? muchas gracias
Edwind Pineda dice
Si en la accion pones un archivo externo pues usarias la variable de sesión que se declaro anteriormente, que es $_SESSION[‘captcha’] donde se almacena las letras para luego compararlo con lo que contiene en el input.
ferchounite dice
y como lo llamaría en el envio_form.php? tal vez sería algo como
$code_verificacion = $_SESSION[‘captcha’] ; no estoy seguro, porque no explicas como hacerlo en un form completo
Josue Ochoa dice
Exactamente, fíjate en el paso «2. index.php», esta explicado como aplicarlo en un formulario.
angel dice
hola edwind he revisado tus articulos en cuanto a formularios de contacto que se envian a un email tengo un problema, soy diseñador de webpages y no programador, hace un tiempo carge un form de contacto y funcionaba perfecto, llegaban todos los mensajes pero el servicio de hosting cambio sus politicas y me han dicho que mi form deja de funcionar por politicas antispam que debo validar el form con email de la empresa y no se a que se refieran podrias ayudarme con esto???
Edwind Pineda dice
Bueno, este método de captcha te debe de ser util para que los «no human» osea robots no puedan mandar mensajes llamados spams.
Superhackerinvencibleguay dice
._. no pillé nada
manolo dice
joe pue e ma facil quue uha patah en uha satén!!!!!! poes cucha retrasaho mentál, soló tenes quue seguí la intrucione pa ke too te saga como una rohsa e u matoral. Es qu hai pesonas tontahs tontash. No cuomo yo, quee soi listo y lo e entendìo.
kaka dice
husa algo del microsoft ese si no entiendes nada vv» , como yo tengo linux…
Henry dice
Amigo Josue, los felicito por estos tutoriales fenomenales, he aprendido mucho de ustedes, estoy armando mi web quickcargofc.com, sigui al pie de la letra como crear y validar un formulario de contacto y me esta funcionando perfectamente, le puedes echar un vistazo en la web. Solo te queria preguntar como hago para intercalar el captcha en ese formulario y ponerlo a funcionar como debe ser? Agradezco tu respuesta. Saludos y muchas gracias.
NanoDesign dice
hola Henry, te quería preguntar si pudiste solucionar tu situación porque yo estoy en la misma…saludos..
José dice
Buen tutorial, saludos
Edwind Pineda dice
gracias Jose.
Pedro Coyoy dice
me da error al cargar la imagen del captcha que esta pasando que no me muestra nada !! me muestra como k la imagen se ubiera roto !!
Edwind Pineda dice
seguro estas colocando mal la ruta de la imagen, recuerda que la imagen debe ser de extencion GIF, saludos
NanoDesign dice
Hola pedro, a mi me pasaba lo mismo corriéndolo en mi servidor local pero cuando lo subí al servidor de mi pagina salio andando…supongo que será porque la configuración de mi servidor local no es la misma o correcta. Fijate por ahí te sirva…saludos
Danielosky dice
Excelente tuto!!!
Aprendi mucho de el
Saludos
Carlos dice
Tengo una pregunta un poco inusual xD… Mi página no está hecha en php… y me gustaría agregar un captcha para un formulario… No se puede hacer de alguna manera con jquery? Gracias de antemano.
Pablo dice
Esta,Bueno! Pero me pregunto si probaras este codigo:
$v){
if ($item==$k){
$itemsEnCesta[$k]+=$cantidad;
$encontrado=1;
}
}
if (!$encontrado) $itemsEnCesta[$item]=$cantidad;
}
}
$_SESSION[‘itemsEnCesta’]=$itemsEnCesta;
?>
<form action="» method=»post»>
Dime el producto
Cuantas unidades
<?
if (isset($itemsEnCesta)){
echo'El contenido de la cesta de la compra es:’;
foreach($itemsEnCesta as $k => $v){
echo ‘Artículo: ‘.$k.’ ud: ‘.$v.»;
}
}
?>
sergio dice
He seguido el ejemplo, y me sale correctamente, pero las letras del captcha aparecen tan pequeñas que ni se ven. Además las letras se sitúan en la esquina superior izquierda, y no se centrarlas.
Gracias, de antemano
Lolsco dice
Hay una forma un poco más fácil, generar nuestra propia imagen usando PHP, aquí les dejo los códigos.
captcha.php
<?php
session_start();
$ancho=50;
$alto=25;
function texto($ancho)
{
$cadena = "0123456789abcdefghijkmnlopqrstwxyz";
for($i = 0; $i
Y esto lo ponen en donde quieran que aparezca el captcha
<?php
session_start();
$code = trim($_POST['code']);
if(isset($_POST['save']))
{
if($_SESSION['captcha'] == $code)
{
echo "Es correcto el captcha ingresado»;
}
else
{
echo «Es incorrecto el captcha ingresado»;
}
}
?>
Lolsco dice
Perdón, se cortó el código.
captcha.php
<?php
$ancho=50;
$alto=25;
function texto($ancho)
{
$cadena = "0123456789abcdefghijkmnlopqrstwxyz";
for($i = 0; $i
Lolsco dice
Olvídenlo, no se quiere poner el código u.u
Sergio dice
Gracias Lolsco, al final puse un captcha de securimage, me he quedado con las ganas de terminar con este, ya que he estado siguiendo los manuales de php para montar un formulario con acceso a base de datos. Pero una vez funcionando ya ni toco. Muchas gracias de todas formas.
RitzCOP dice
Hola, porque no funcionan los archivos en localhost con el WAMP? gracias por todo…
Josue Ochoa dice
Deberian funcionar, si no funcionan es porque no esta corriendo el servidor Apache o algo similar.
RitzCOP dice
Gracias x tu respuesta WebStar 🙂 pero porqué todos los demás proyectos y códigos PHP que tengo en la carpeta del server funcionan bien? incluso baje otro ejemplo de otro captcha de otra página y tampoco corre en local, en un hosting si, pero en LOCALHOST no… solo pasa con los captcha, saludos…
Maria dice
Hola
Tengo este codigo de formulario y no consigo poner bien el captcha. No soy una gran experta en codigos. El caso que al pegar los codigos, aparece el captcha, si escribo mal me dice incorrecto con letras en rojo, si escribo bien correcto con letras verdes, pero en el caso de que me quede sin rellenarlo y le de al boton enviar, el formulario me lo envia al correo igualmente 🙁
GRACIAS POR ADELANTADO!!!!!!!! Espero podáis ayudarme.
Me podéis ayudar por favor?
Captcha ya en el codigo
< ? php
//CONFI
$direccion_envio= 'email@decontacto.com';
//la direccion a la que se enviara el email.
$url= 'http://direccionweb.com';
//la URL donde esta publicado el formulario.
//FIN CONFI
From = $_POST[‘email’];
$mail->FromName = $_POST[‘nombre’];
$mail->AddAddress($direccion_envio);
$mail->Subject = «Contacto»;
$mail->AddReplyTo($_POST[‘email’],$_POST[‘nombre’]);
$mail->IsHTML(true);
$comentario=$_POST[‘comentario’];
//comprobamos si todos los campos fueron completados
if ($_POST[‘email’]!=» && $_POST[‘nombre’]!=» && $_POST[‘comentario’]!=» && $error_archivo==») {
$email=$_POST[‘email’];
$nombre=$_POST[‘nombre’];
$comentario=$_POST[‘comentario’];
//armamos el html
$contenido = »;
$contenido .= ‘Nombre: ‘.$nombre.’‘;
$contenido .= ‘Email: ‘.$email.’‘;
$contenido .= ‘Mensaje: ‘.$comentario.’‘;
$contenido .= »;
$mail->Body = $contenido;
// si todos los campos fueron completados enviamos el mail
$mail->Send();
$flag=’ok’;
$mensaje=’Mensaje enviado! ‘;
} else {
//si no todos los campos fueron completados se frena el envio y avisamos al usuario
$flag=’err’;
$mensaje=’- Los Campos Marcados Con * Son Requeridos. ‘.$error_archivo.»;
}
}
?>
Contactenos – v4
1) {$plural=’s’;} else {$plural=»;} ?>
Nombre*
<input size="40" type=»text» name=»nombre» value=»» />
Email*
<input size="40" type=»text» name=»email» value=»» />
Mensaje*
<textarea cols="60" rows="10" name=»comentario»>
<?php
session_start();
$code = trim($_POST['code']);
if(isset($_POST['save']))
{
if($_SESSION['captcha'] == $code)
{
echo "Es correcto el captcha ingresado»;
}
else
{
echo «Es incorrecto el captcha ingresado»;
}
}
?>
CODIGO SIN CAPTCHA
< ? php
//CONFI
$direccion_envio= 'email@decontacto.com';
//la direccion a la que se enviara el email.
$url= 'http://direccionweb.com';
//la URL donde esta publicado el formulario.
//FIN CONFI
From = $_POST[‘email’];
$mail->FromName = $_POST[‘nombre’];
$mail->AddAddress($direccion_envio);
$mail->Subject = «Contacto»;
$mail->AddReplyTo($_POST[‘email’],$_POST[‘nombre’]);
$mail->IsHTML(true);
$comentario=$_POST[‘comentario’];
//comprobamos si todos los campos fueron completados
if ($_POST[‘email’]!=» && $_POST[‘nombre’]!=» && $_POST[‘comentario’]!=» && $error_archivo==») {
$email=$_POST[‘email’];
$nombre=$_POST[‘nombre’];
$comentario=$_POST[‘comentario’];
//armamos el html
$contenido = »;
$contenido .= ‘Nombre: ‘.$nombre.’‘;
$contenido .= ‘Email: ‘.$email.’‘;
$contenido .= ‘Mensaje: ‘.$comentario.’‘;
$contenido .= »;
$mail->Body = $contenido;
// si todos los campos fueron completados enviamos el mail
$mail->Send();
$flag=’ok’;
$mensaje=’Mensaje enviado! ‘;
} else {
//si no todos los campos fueron completados se frena el envio y avisamos al usuario
$flag=’err’;
$mensaje=’- Los Campos Marcados Con * Son Requeridos. ‘.$error_archivo.»;
}
}
?>
Contactenos – v4
1) {$plural=’s’;} else {$plural=»;} ?>
<form action="» method=»post» enctype=»multipart/form-data»>
Nombre*
<input size="40" type=»text» name=»nombre» value=»» />
Email*
<input size="40" type=»text» name=»email» value=»» />
Mensaje*
<textarea cols="60" rows="10" name=»comentario»>
Maria dice
He conseguido poner los codigos con la parte que no salia, aunque he tenido que separar los < ? porque sino no salia, pero van todos juntos en el php. Perdonad
Guest dice
Se corto la parte de arriba del codigo
<?php
//CONFI
$direccion_envio= 'email@decontacto.com';
//la direccion a la que se enviara el email.
$url= 'http://direccionweb.com';
//la URL donde esta publicado el formulario.
//FIN CONFI
<?PHP
//proceso del formulario
// si existe "enviar"…
if (isset ($_POST['enviar'])) {
// vamos a hacer uso de la clase phpmailer,
require("inc/class.phpmailer.php");
$mail = new PHPMailer();
//recogemos las variables y configuramos PHPMailer
Guest dice
No sale 🙁 A ver ahora….
< ? php
//CONFI
$direccion_envio= 'email@decontacto.com';
//la direccion a la que se enviara el email.
$url= 'http://direccionweb.com';
//la URL donde esta publicado el formulario.
//FIN CONFI
<?PHP
//proceso del formulario
// si existe "enviar"…
if (isset ($_POST['enviar'])) {
// vamos a hacer uso de la clase phpmailer,
require("inc/class.phpmailer.php");
$mail = new PHPMailer();
//recogemos las variables y configuramos PHPMailer
josueochoa dice
Copia el código a Pastebin o a Gist y pon el link aqui.