Captcha con protección de colores (y 2)

0 - , , - 01/03/2011 17:00:06

A petición de algunos lectores, voy a publicar un pequeño ejemplo sobre la aplicación de mi anterior post "Captcha con protección de colores". Tanto el citado post como éste, son ejemplos. Deben ser tomados como puntos de partida y presuponen ciertos conocimientos de programación que se escapan del propósito de ambos posts. Dicho esto, veamos un ejemplo más completo. Necesitamos dos ficheros. El primero es el capcha, la imagen que el usuario deberá reconocer. Podemos nombrar el fichero como captha.php y el código sería el siguiente:

captha.php

<?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);
?>

Ahora necesitamos crear otro fichero (formulario.php) que se encargará de procesar los campos del formulario y comprobar que el captcha ha sido introducido correctamente.

formulario.php

<?php
session_start();
if($_POST['enviar']=="ok") {
	// LIMPIAMOS LO RECOGIDO EN EL FORMULARIO
	$captcha_recogido = filter_var($_POST['valores_captcha'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
	// CONVERTIMOS EN MAYUSCULAS
	$captcha_recogido = strtoupper($captcha_recogido);
	if(empty($captcha_recogido)) {
		echo "<strong>Debes introducir los caracteres en rojo que aparecen en la imagen.</strong>";
	}else{
		if($captcha_recogido==$_SESSION['captcha']['red']) {
			// HA INTRODUCIDO CORRECTAMENTE EL CAPTCHA Y
			// CONTINUAMOS PROCESANDO EL FORMULARIO
			echo "<strong>El formulario ha sido procesado.</strong>";
		}else{
			echo "<strong>Los caracteres introducidos no coinciden con los de la imagen. Inténtalo otra vez.</strong>";
		}
	}
}
?>
<form action="#" method="post" name="form_captha">
<!-- CAMPOS DEL FORMULARIO -->
<p><img src="01032011_captcha.php" alt="captcha" /></p>
<p><label>Teclea los caracteres en rojo</label><input type="text" name="valores_captcha" /></p>
<input name="enviar" type="submit" value="ok" />
<label>
</form>

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