Captcha con PHP y JpGraph

JpGraph una de las librerías mas completas para generar imágenes de la cual hemos hablado en JpGraph: Gráficos con PHP tiene entre una de sus características la de generar imágenes para hacer captcha. En esta ocasión veremos la forma de implementar un formulario que incluya verificación por captcha para protegerlo del ataque de los spammers.

catpcha-jpgraph.gif

Captcha con JpGraph
JpGraph posee una librería llamada jpgraph_antispam.php la cual permite generar las imagenes con textos aleatorios distorsionados. Entonces lo primero es incluir el archivo jpgraph_antispam.php y luego creamos la imagen con la función Rand que recibe como parámetro la cantidad de caracteres a generar.

[php]
include(“inc/jpgraph_antispam.php”);
$spam = new AntiSpam();
$code = $spam->Rand(6);
$spam->Stroke();
[/php]

En el ejemplo hemos generado una imagen con un texto aleatorio de 6 caracteres. Notese que el texto generado es devuelto por esta función y la hemos almacenado en la variable $code. Esta variable la podríamos almacenar en una variable de sesión para verificarla posteriormente.

Creando el Captcha
Entonces creamos un archivo php llamado captcha.php en el cual generaremos un texto aleatorio y lo almacenaremos en una variable de sesión y luego generamos la imagen captcha.

[php]
// file: captcha.php
include(“inc/jpgraph_antispam.php”);
session_start();
$spam = new AntiSpam();
$_SESSION[‘tmptxt’]= $spam->Rand(6);
$spam->Stroke();
[/php]

Con lo cual obtenemos el siguiente resultado:

Creando el formulario
el siguiente paso es la creación del formulario que deseamos proteger, para nuestro ejemplo solo incluiremos un campo de texto solicitando nombres y luego incluimos la imagen.

  1. <h3>Formulario</h3>
  2. <form name="register" method="post">
  3. Nombres<br />
  4. <input name="nombres" type="text" id="nombres" /><br />
  5. Verificacion:<br />
  6. <img src="captcha.php" width="100" height="30"><br />
  7. <input name="tmptxt" type="text" id="tmptxt" /><br />
  8. <input type="submit" name="Submit" value="Enviar" />
  9. <input name="action" type="hidden" value="checkdata">
  10. </form>

Verificando los datos
Finalmente en la pagina que recibe los datos del formulario primero verificamos que el texto ingresado corresponda al generado en el captcha antes de procesar los datos.

[php]
session_start();
if ($_POST[‘action’] == “checkdata”) {
if ($_SESSION[‘tmptxt’] == $_POST[‘tmptxt’]) {
echo “Bienvenido “.$_POST[‘nombres’];
} else {
echo “Error: Inténtalo nuevamente”;
}
exit;
}
[/php]

Sencillo y con código muy entendible para poder modificarlo y adaptarlo a nuestras necesidades. Pueden ver el resultado del ejemplo funcionando en: http://samples.unijimpe.net/jpgraph/demo-captcha.php .

Comentarios Total 13 comentarios


Daniel
Publicado: 30/10/2007 7:18 pm

Gracias me viene de perlas :)

Marc
Publicado: 01/11/2007 12:30 am

Muy bueno :D
Me hacia mucha falta

juan
Publicado: 06/12/2007 3:38 am

Hola unijimpe, como puedo modificar la imagen creeada con esta libreria, que fuera mas parecida a la de tu ejemplo de “crear captcha con php” pues la que genera el jpgraph_antispam.php aveces es poco entendible

Raul
Publicado: 17/05/2008 9:50 am

Hola, me viene muy bien, tengo un pequeño problemita, la imagen no es igual a la variable de sesión, en la variable de sesión guarda el captcha anterior, alguna forma de solucionar esto?.

juanito
Publicado: 23/08/2008 9:33 pm

solo un pequeño detalle, en la carpeta “inc”, hay un monton de archivos (4MB en total), pero solo necesitamos 2:
jpgraph_antispam-digits.php y
jpgraph_antispam.php

Artenara
Publicado: 17/12/2008 11:28 am

Bueno a todos los comentarios que he leido sobre que no les funciona la imagen, les recomiendo que instalen las librerias GD,

por ejemplo en debian con php5

apt-get install php5-gd

debian php4

apt-get install php4-gd

saludos a todos gracias por estas colaboraciones.

Edgar
Publicado: 02/04/2009 3:56 pm

Hola a todos, espero me puedan ayudar cuando realice el ejemplo con jpgraph cuando abro captcha.php no veo la imagen solo sale la siguiente linea:

Rand(6); $_SESSION[‘tmptxt’] = $chars; $spam->Stroke(); ?>

me pueden decir que esta mal??


[…]  http://blog.unijimpe.net/captcha-con-php-y-jpgraph/ , encuentro un excelente artículo, en donde explica como implementar un sistema Captcha propio, […]

Giovanni Mejia
Publicado: 10/02/2010 12:54 pm

quiero adaptar este formulario con captcha a mi web, pero quiero que la información se envie a mi correo electronico y he puesto este codigo abajo del echo, asi:

y si lo recibo en mi correo pero sin nada de información, como puedo crear las variables que me guardan la información que digitan los usuarios y al darle enviar toda esa información llegue a mi correo. Gracias por su ayuda esperare su respuesta.

Alberto
Publicado: 10/02/2010 11:05 pm

Excelente articulo, muchas gracias, me ha servido, ya me tienen hasta la coronilla los robots con el spam. Mi sitio recibe al dia 50 spams en promedio :S, ya no mas!! gracias a este excelente articulo

Ismael
Publicado: 03/04/2010 7:37 pm

Pues me da un error la cosa es que el capcha osea la imagen es distinta al codigo de la sesion ej

el de la imagen sale 111111
y nunca me funciono puse un echo a ver si eran iguales y el echo me salia ej 222222

osea la imegen decia una cosa y la seson decia otra noentiendo :$

Por favor help es el mejor capcha ahsta ahora

Manuel
Publicado: 29/07/2011 3:45 am

No muestra la imagen con captcha.php y captcha demo.php, que le falta ?

Daniel Vázquez
Publicado: 05/03/2013 2:38 pm

Excelente artículo! Me funcionó a la perfección!

Solo necesite :

– jpgraph_antispam.php
– leer bien el articulo.

Gracias!

 

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