Foros del Web » Programando para Internet » PHP »

[APORTE] Captcha metodo DelaRub

Estas en el tema de [APORTE] Captcha metodo DelaRub en el foro de PHP en Foros del Web. Qué es el captcha DelaRub? Es un tipo de captcha que dificulta bastante la tarea de ser reconocido automáticamente por programas. ¿Cómo funciona? El método ...
  #1 (permalink)  
Antiguo 12/05/2009, 15:08
Avatar de delarub  
Fecha de Ingreso: mayo-2009
Mensajes: 20
Antigüedad: 14 años, 11 meses
Puntos: 2
[APORTE] Captcha metodo DelaRub

Qué es el captcha DelaRub?
Es un tipo de captcha que dificulta bastante la tarea de ser reconocido automáticamente por programas.

¿Cómo funciona?
El método DelaRub consiste en utilizar los mismos colores para las letras que para el fondo de manera que sea tarea complicada separar las letras del fondo.

Para ello, utiliza como fondo de captcha un degradado de color, y encima las letras con el color opuesto al de ese lugar del degradado. Si ahora no se ha entendido, con la explicación será mas sencillo.

Programando un captcha DelaRub

Vamos a partir de un simple captcha que hemos programado, y que no tiene casi seguridad.
Código PHP:
<?php

function textoAleatorio($largo) {

    
// Todas las letras posibles
    
$letras "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYZ";
    
    
// Un loop para hacer $largo letras
    
for ($i 1$i <= $largo$i++) {
        
// Obtenemos un numero aleatorio entre 0 y el numero de letras
        
$num rand(0strlen($letras) - 1);
        
        
// Y añadimos la letra segun el numero
        
$final .= $letras{$num};
    }
    
    
// Devolvemos el resultado
    
return $final;
    
}

// 8 Letras en el captcha
$cantidadLetras 8;

// Creamos una cadena aleatoria
$cadena textoAleatorio($cantidadLetras);

// Creamos una imagen y asignamos colores
$captcha imagecreate(10035);
$colorBlanco imagecolorallocate($captcha255255255);
$colorNegro imagecolorallocate($captcha000);

// Imprimimos la cadena en la imagen
imagestring($captcha51010$cadena$colorNegro);

// Mostramos el captcha
header("Content-type: image/png");
imagepng($captcha);

?>
Ahora que tenemos eso, vamos a hacerlo un poco más dificil modificando las alturas de las letras. Para ello, reemplazamos

Código PHP:
// Imprimimos la cadena en la imagen
imagestring($captcha51010$cadena$colorNegro); 
por

Código PHP:
// Imprimimos la cadena en la imagen, con alturas aleatorias
for ($i 1$i <= $cantidadLetras$i++) {
    
imagestring($captcha510 $irand(120), $cadena{$i 1}, $colorNegro);

Función principal del captcha DelaRub

Código PHP:
function delarubCaptcha($captcha$rgbInicial$rgbFinal) {
// Esta funcion crea un fondo degradado y adapta las letras
// para que sean legibles con los mismos colores que el fondo
// de manera que un bot no puede eliminar el fondo.

// Estructura de los rgb -> R|G|B

// Dividimos el string $rgbInicial para obtener un array con los 3 colores
$rgbIniArray explode("|"$rgbInicial);
// Y los asignamos
$rInicial $rgbIniArray[0];
$gInicial $rgbIniArray[1];
$bInicial $rgbIniArray[2];

// Igual que antes
$rgbFinArray explode("|"$rgbFinal);
$rFinal $rgbFinArray[0];
$gFinal $rgbFinArray[1];
$bFinal $rgbFinArray[2];

// Obtenemos el ancho y alto de la imagen
$ancho imagesx($captcha);
$alto imagesy($captcha);

// Calculamos cuanto R bajar en cada linea
$difRojo $rFinal $rInicial;
$difRojo $difRojo $alto;

// Calculamos cuanto G bajar en cada linea
$difVerde $gFinal $gInicial;
$difVerde $difVerde $alto;

// Calculamos cuanto B bajar en cada linea
$difAzul $bFinal $bInicial;
$difAzul $difAzul $alto;

// Recorremos la imagen de arriba a abajo
for ($i 0$i <= $alto$i++) {
    
// Calculamos el color rojo que toca para la linea
    
$colorRojo round($rInicial + ($i $difRojo));    
    
    
// Y para la letra
    
($rInicial $rFinal) ? ($rojoLetra $rInicial - ($colorRojo $rFinal)) : ($rojoLetra $rFinal - ($colorRojo $rInicial));
      
    
// Calculamos el color verde que toca para la linea
    
$colorVerde round($gInicial + ($i $difVerde));   
    
    
// Y para la letra
    
($gInicial $gFinal) ? ($verdeLetra $gInicial - ($colorVerde $gFinal)) : ($verdeLetra $gFinal - ($colorVerde $gInicial));
      
    
// Calculamos el color azul que toca para la linea
    
$colorAzul round($bInicial + ($i $difAzul));    
    
    
// Y para la letra
    
($bInicial $bFinal) ? ($azulLetra $bInicial - ($colorAzul $bFinal)) : ($azulLetra $bFinal - ($colorAzul $bInicial));
       
    
// Preparamos los dos colores
    
$colorLinea imagecolorallocate($captcha$colorRojo$colorVerde$colorAzul);
    
$colorLetra imagecolorallocate($captcha$rojoLetra$verdeLetra$azulLetra);
    
    
// Por cada linea, de izquierda a derecha
    
for ($x 0$x <= $ancho$x++) {
        
        
//Y pintamos segun si es letra o no
        
(imagecolorat($captcha$x$i) != 0) ? (imagesetpixel($captcha$x$i$colorLetra)) : (imagesetpixel($captcha$x$i$colorLinea));
    }
}




Como podeis ver, esta función es un poco larga. Lo que hace es ir pixel por pixel pintando un degradado desde el primer color hasta el segundo color.
La función necesita 3 parametros, el primero es la imagen, el segundo y el tercero son los colores para hacer el degradado, que ha de tener la estructura R|G|B (por ejemplo, blanco sería 255|255|255)
Únicamente pintará el degradado si encuentra un pixel blanco (fondo), si encuentra uno negro (letra) pintará con el color "opuesto" (no es opuesto como complementario, sino el que está en la misma altura que esa letra pero empezando por abajo).
El resultado es algo parecido a esto:

magiocr.sourceforge.net/delarub.php (aun no me deja poner links jeje)

Como podeis ver, todavia es simple, pero le podéis agregar más cosas, como por ejemplo que los degradados los cree con colores aleatorios (rand()), añadir lineas, cambiar fuentes, etc...

Att, delarub;
magicocr.sourceforge.net
  #2 (permalink)  
Antiguo 12/05/2009, 15:53
 
Fecha de Ingreso: diciembre-2008
Mensajes: 100
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: [APORTE] Captcha metodo DelaRub

Muchas gracias por el aporte, se ve interesante.

P.D: El enlace es este:
http://magicocr.sourceforge.net/delarub.html
  #3 (permalink)  
Antiguo 13/05/2009, 09:09
Avatar de delarub  
Fecha de Ingreso: mayo-2009
Mensajes: 20
Antigüedad: 14 años, 11 meses
Puntos: 2
Respuesta: [APORTE] Captcha metodo DelaRub

Cita:
Iniciado por pablitino Ver Mensaje
Muchas gracias por el aporte, se ve interesante.

P.D: El enlace es este:
magicocr.sourceforge.net/delarub.html
Muchas gracias por poner el link :P

Creeis que es "seguro" utilizar este método?
Estoy programando magicOCR (reconocimiento de captchas) y con este captcha (entre otros) no puede. Pero he mirado el funcionamiento de otros lectores de captchas y basandome en su funcionamiento creo que este método es bastante seguro.

Cuando acabe con magicOCR lo publicaré aqui para que lo probeis

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:39.