Como crear un Captcha con PHP
Cuando entras en un formulario y te encuentras con un texto deformado en una imagen que te pide que escribas su código, te estas topando con un Catpcha, y su finalidad es saber si el que está rellenando el formulario es una máquina (un robot programado para crear spam en tu e-mail), o un humano.
Como primer punto crearemos un archivo llamado “genera_img.php”, el nombre es opcional ya que cuando es llamado este archivo puedes cambiarle el nombre pero también cuando es invocado; el código que contiene es el siguiente y se explica línea por línea para que entiendas mejor.
Lo que hace este archivo es mostrar una imagen al azar por medio del código que genera un nuevo archivo que crearas en el siguiente punto; este código utiliza la librería GD que es la indicada para el manejo de imágenes .jpg, .gif o .png:
// Iniciamos uso de sesiones ...
session_start();
/*recogemos el texto por el URL que enviamos a generar
desde el link de imagen del HTML de nuestro formulario*/
$codigo=$_SESSION['mipass'];
/*nombres tipografías a usar
(sin extensión .ttf)*/
$tipografias = array(“hearts”
,”ADLER___”);
/*directorio donde estén las fuentes
(ruta absoluta) importante el último / */
$tipografias_ruta = ”C:WINDOWSFonts”;
/* $tipografias_ruta=”/home/sito/public_html/
fonts/”; linux */
/* inicializa eje X desde donde se
empezará a dibujar el código
(referente al tamaño de la caja)*/
$espacio = 0;
//tamaño fuente.
$tamano_fuente = 20;
/* profundidad caracteres/digitos del código
a generar (password). */
$profundidad_codigo = 8; // (alfanuméricos)
//cálculo Ancho automático de la caja
$x=200;
$y=40;
$angmax = 45;
$hori = 100;
$verti = 200;
/* Iniciar la generación de la imagen.
Se define una caja de $x por $y pixels. */
$im = imagecreate($x, $y);
/* definición Colores.
Expresados en valores R G B (respectivamente). */
// Gris
$color_fondo = imagecolorallocate($im, 10, 10, 10);
// Casi blanco
$color_texto = imagecolorallocate($im, 250, 250, 250);
for($caracter=0; $caracter<$profundidad_codigo;
$caracter++){
$rhori = rand(-$hori, $hori);
$rverti = rand(-$verti, $verti);
// intento de lineas
$lineColor = imagecolorallocate($im, 250, 250, 250);
$lineColor2 = imagecolorallocate($im, 250, 250, 250);
imagefill($im, 0, 0, $color_fondo);
/* imageline( imagen, separacion izq, separacion
superior, largo, inclinacion) */
//linias horizontales
imageline($im, 0, $rhori, 200, $rhori, $lineColor);
imageline($im, 0, $rhori+20, 200, $rhori+20,
$lineColor);
// linias verticales,
imageline($im, $rverti, 0, 25, 700, $lineColor);
imageline($im, $rverti+20, 0, 25, 700, $lineColor);
}
for($caracter=0; $caracter<$profundidad_codigo;
$caracter++){
//seleccion de una tipografía aleatoria.
$indice_aleatorio=array_rand($tipografias);
$tipografia=$tipografias_ruta.$tipografias
[$indice_aleatorio].’.ttf’;
//separación entre caracteres
$espacio +=$tamano_fuente;
$ang = rand(-$angmax, $angmax);
//generar el caracter gráfico.
//imagettftext($im, $tamano_fuente, 0, $espacio,
$tamano_fuente, $color_texto, $tipografia ,
$codigo{$caracter});
imagefttext($im, $tamano_fuente, $ang, $espacio, 30,
$color_texto, $tipografia, $codigo{$caracter});
}
/* cabecera HTTP la cual indica al navegador que
la imagen que estamos generando es .PNG */
header(‘Content-type: image/png’);
//genera un png dinámico
imagepng($im);
//destruye la imagen del servidor
imagedestroy($im);
Como segundo punto creas el archivo encargado para generar los caracteres del password se llama “gen_codigo.php” y es tan simple como se muestra a continuación:
/* definimos la funcion, el parametro$tipo
es opcional y permite que el codigo sea
numerico o alfanumerico */
function genera_password($longitud,$tipo="
alfanumerico"){
//hacemos la comprobacion
if ($tipo==”alfanumerico”){
$exp_reg=”[^A-Z0-9]“;
} elseif ($tipo==”numerico”){
$exp_reg=”[^0-9]“;
}
//generamos el codigo al azar
return substr(eregi_replace($exp_reg,
”", md5(time())) .
eregi_replace($exp_reg, ”",
md5(time())) .
eregi_replace($exp_reg, ”",
md5(time())),
0, $longitud);
}
El tercer archivo a utilizar es “procesa.php” (los nombres son opcionales pero recordando cambiar la invocacion en el lugar del codigo indicado), y este se encarga de verificar si el código generado mostrado en la imagen es el mismo que ingresa el usuario:
// inicio sesiones
session_start();
// Checamos que haya un valor en la
sesion para evitar robots...
if(empty($_SESSION['mipass'])) {
header("Location: tupagina.php");
}
// Checamos que haya un codigo minimo...
if(empty($_POST['pass'])) {
echo "No escribiste nada";
echo "<meta http-equiv='refresh'
content='1'>";
unset($_SESSION);
session_destroy();
exit;
}
// Comparamos los valores
if ($_SESSION['mipass'] ==
$_POST['pass']){
echo "código/contraseña
aceptado .. coincide ...";
} else {
echo "Pues el código/
contraseña NO coincide ...";
echo "<meta http-equiv='
refresh' content='1'>";
}
// Y nos deshacemos de la sesión …
unset($_SESSION);
session_destroy();
Por ultimo creas la página donde se ingresara el código. En este tutorial se llama “tupagina.php” y solo muestra una caja de texto y un botón submit:
// inicio uso sesiones.
session_start();
/* aquí metes tu
función genera_password */
include ("gen_codigo.php");
/* llamas a la función
para generar un password. */
$pass=genera_password(8);
/* lo dejamos en una variable de
sesión para poderlo leer de
forma segura en otro proceso.php ...*/
$_SESSION['mipass']=$pass;
Ahora puedes personalizar el código de la siguiente manera:
/* nombres tipografías a
usar (sin extensión .ttf) */
$tipografias = array("hearts",&
quot;ADLER___");
// directorio donde estén las fuentes
// (ruta absoluta)importante el último /
$tipografias_ruta = "C:WINDOWSFonts";
/* $tipografias_ruta="/home/sito/
public_html/fonts/"; */
//Linux
Si los archivos de la tipografía están en el mismo directorio que los archivos .php debes dejarlos vacíos así: “”
Una parte importante es que las tipografías tengan el nombre del archivo no el nombre de la tipografía, por ejemplo el archivo se llama “hearts.ttf” pero solo se indica “hearts” porque más adelante en el código se define que son tipografías TrueType, y como consecuencia se establece el nombre del archivo como en este caso que el nombre de la tipografía es “Hearts BRK”.
Esta parte es para definir el largo y alto de nuestra imagen:
$x=200; $y=40; $angmax = 45; $hori = 100; $verti = 200;
Aquí indicas los colores de la imagen de fondo, el color de las líneas horizontales y verticales y el color del texto:
// gris $color_fondo = imagecolorallocate($im, 10, 10, 10); // casi blanco $color_texto = imagecolorallocate($im, 250, 250, 250);
Puedes ver cómo queda visitando el siguiente enlace de ejemplo. Recuerda presionar la tecla F5 para que cambie la imagen:
http://tianguiscamionero.com/v2/tupagina.php
También te pueden interesar estos artículos...
- Sistema de logueo con PHP y MySQL.
- Crear sitios multidiomas con PHP.
Sin comentarios. Se el primer usuario en comentar.
Inicia sesión o regístrate para comentar. Es gratis y rápido.







