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.




