Tema: FAQ's de PHP
Ver Mensaje Individual
  #115 (permalink)  
Antiguo 27/09/2004, 17:16
Avatar de Takitei
Takitei
 
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 20 años, 1 mes
Puntos: 5
Tema: Generando archivos no HTML (creo)
Pregunta: ¿Cómo hacer un código visual de seguridad? (CAPTCHA)
Respuesta: Muchos hemos querido desarrollar un código visual al estilo Google, Hotmail, etc... donde tenemos que escribir en un campo input el contenido de una imagen.

Este código fue originalmente solicitado por Section1, desarrollado por Cluster, con aportes de josemi, sin embargo... tenía algunos errorcitos pequeños de sintaxis que corregí.

Basicamente serían 4 archivos:

gen_codigo.php
donde se generará el código que mostrará nuestra imagen
Código PHP:
<?php
function genera_password($longitud,$tipo="alfanumerico"){

if (
$tipo=="alfanumerico"){
$exp_reg="[^A-Z0-9]";
} elseif (
$tipo=="numerico"){
$exp_reg="[^0-9]";
}

return 
substr(eregi_replace($exp_reg""md5(time())) .
eregi_replace($exp_reg""md5(time())) .
eregi_replace($exp_reg""md5(time())),
0$longitud);
}
?>
tupagina.php
donde colocarás tu formulario y aparecerá la imagen generada
Código PHP:
<?php
// 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;
?>
<html>
</head>
</head>
<body>
<!-- .. etc y tu formulario con -->
<form action="procesa.php" method="POST">

<!-- la imagen generada con nuestro password ... -->
<img src="genera_img.php">

<input type="text" name="pass">
etc... campos y botón enviar ...
</form>
</body>
</html>
genera_img.php
el cual precisamente generará la imagen que contendrá el password generado por gen_codigo.php
Código PHP:
<?php
// 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("fuente1","fuente2");

//directorio donde estén las fuentes (ruta absoluta) importante el último /
$tipografias_ruta "C:\WINDOWS\Fonts\\";
// $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 6// (alfanuméricos)

//cálculo Ancho automático de la caja
$x=150;
$y=40;
$angmax 20;
$hori 50;
$verti 100;
// 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).
$color_fondo imagecolorallocate($im255255255); // Blanco
$color_texto imagecolorallocate($im000); // Negro

for($caracter=0$caracter<$profundidad_codigo$caracter++){
    
$rhori rand(-$hori$hori);
    
$rverti rand(-$verti$verti);
    
// intento de lineas
    
$lineColor imagecolorallocate($im000);
    
$lineColor2 imagecolorallocate($im000);
    
imagefill($im00$color_fondo);
    
//imageline( imagen, separacion izq, separacion superior, largo, inclinacion)

    //linias horizontales
    
imageline($im0$rhori200$rhori$lineColor);
    
imageline($im0$rhori+20200$rhori+20$lineColor);
    
// linias verticales, 
    
imageline($im$rverti025700$lineColor);
    
imageline($im$rverti+20025700$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$espacio30$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);
?>
procesa.php
el cual mostrará el resultado en cuando al proceso, si la imagen es correcta o incorrecta.
Código PHP:
<?php
// 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";
}
// 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 ...";
}

// Y nos deshacemos de la sesión ...
unset($_SESSION);
session_destroy();
?>
Eso es todo. Asi crearemos el propio sistema seguro para que nuestros usuarios se registren en nuestra página sin usar robots. Muy util cuando nuestra web es muy recurrida. Suerte!

Discusión completa en: http://www.forosdelweb.com/f18/como-hacer-codigo-visual-seguridad-183848/
Actualización 22/6/2006 por bauhaus1975: falta inicio sesión en genera_imagen.php
Actualizado: 21/02/08 por GatorV: mejorado el codigo para el Captcha y agregado codigo para verificar y prevenir contra Spam Bots.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.

Última edición por jam1138; 02/06/2008 a las 18:59 Razón: Actualizado para mejorar el captcha