Captcha con protección de color

0 - , , - 25/02/2011 18:39:36

En snipplr he visto un interesante snippet de PHP que permite crear un captha con dos colores -azul y rojo- de modo que podemos indicar a los usuarios que sólo introduzcan los caracteres de color rojo o los de azul. La mayor parte de los bots siempre intentan descifrar todo lo mostrado en este tipo de imagenes.

El código que a continuación se presenta en este post parte de esta idea pero introduciendo un ligero cambio o aportación. Se establecen a priori los caracteres sobre los que posteriormente se extraen aleatoriamente 5 de los mismos. De ese modo se evitan posibles confusiones entre por ejemplo "o" y "0" ó "1" y "l".

<?php
session_start();
header("Content-type: image/png");
$anchura = 146;
$altura = 30;

$im = @imagecreate($anchura, $altura)or die("Cannot Initialize new GD image stream");
imagecolorallocate($im, 255, 250, 255);
$noise_color = imagecolorallocate($im, 207, 239, 250);
for($i=0; $i<($anchura*$altura)/3; $i++) {
	imagefilledellipse($im, mt_rand(0,$anchura), mt_rand(0,$altura), 1, 1, $noise_color);
}
for($i=0; $i<($anchura*$altura)/150; $i++ ) {
 imageline($im, mt_rand(0,$anchura), mt_rand(0,$altura), mt_rand(0,$anchura), mt_rand(0,$altura), $noise_color);
}

$texto_color[0] = imagecolorallocate($im, 255, 0, 0);
$texto_color[1] = imagecolorallocate($im, 51, 166, 207);

$caracteres = 'ABCDEFGHKLMNPRSTUVWYZ23456789';
$longitud = 5;
  function generarCodigo($longitud,$caracteres) {
    $code = '';
    for($i = 1, $cslen = strlen($caracteres); $i <= $longitud; ++$i) {
      $code .= strtoupper( $caracteres{rand(0, $cslen - 1)} );
    }
    return $code;
}
$texto = generarCodigo($longitud,$caracteres);

unset($_SESSION['captcha']);
$_SESSION['captcha']['blue'] = $_SESSION['captcha']['red'] = '';

for($j = 0; $j < mb_strlen($texto); $j++) {
	imagettftext($im, 20, 0, 5+($j*23), 24, $texto_color[$j%2], 'Includes/elephant.ttf', $texto[$j]);
	if(($j%2) == 1) {
		$_SESSION['captcha']['blue'] .= $texto[$j];
	}
	else {
		$_SESSION['captcha']['red'] .= $texto[$j];
	}
}
imagepng($im);
imagedestroy($im);
?>

Para comprobar si el captcha ha sido introducido correctamente, deberemos usar $SESSION['captcha']['red'] para comprobar los caracteres en rojo y $SESSION['captcha']['blue'] para los azules.

Ver ejemplo en funcionamiento » »

Deja tu comentario

  • El comentario debe estar relacionado con el contenido de la entrada.
  • Comentarios ofensivos, con spam o con lenguaje inapropiado serán eliminados.

captcha