Explicando los captchas
Los captcha son una prueba-desafío para determinar cuando el usuario es humano o no, consiste en mostrar una imagen con un texto distorsionado de forma que una máquina no sea capaz de comprender e introducir las letras de forma correcta sin embargo un humano sí podría hacerlo.
La programación en PHP es sencilla siempre y cuando entendamos la sintáxis de algunas funciones LibGD. Básicamente se trata de, dada una fuente (truetype en este caso) y una imagen de fondo (cuanto menos uniforme mejor) crear una nueva imagen con un texto aleatorio. La fuente se llama captcha.ttf, el fondo fnd_captcha.jpg y la página encargada de generar la imagen es la siguiente (captcha.php):
<?php session_start(); $str = ""; for ($i = 0; $i < 4; $i++) // Generamos un texto aleatorio de 4 caracteres { $str .= chr(rand(97, 122)); } $_SESSION['captcha'] = $str; // Dimensiones de la imagen $imgX = 90; $imgY = 23; $image = imagecreatefromjpeg("./fnd_captcha.jpg"); // Fondos y colores (de borde y texto) $backgr_col = imagecolorallocate($image, 238,239,239); $border_col = imagecolorallocate($image, 0,0,0); $text_col = imagecolorallocate($image, 52,99,255); imagerectangle($image, 0, 0, 89, 29, $border_col); $font = "./captcha.ttf"; // La fuente ttf $font_size = 14; $angle = 15; $box = imagettfbbox($font_size, $angle, $font, $str); $x = (int)($imgX - $box[4]) / 2; $y = (int)($imgY - $box[5]) / 2; imagettftext($image, $font_size, $angle, $x, $y, $text_col, $font, $str); header('Content-type: image/png'); imagepng($image); imagedestroy ($image); ?>La página nos devuelve la imagen, osea que la usaremos como fuente del tag img, algo así:
<img src="captcha.php" alt="Captcha" />
Además de la imagen tenemos una variable $_SESSION['captcha'] con el valor de la cadena generada, que nos servirá para saber si el usuario teclea lo que ve o no (imaginando que el input del formulario se llamase captcha_form):
<?php if($_SESSION[captcha]==$_POST[captcha_form]) $correcto=1; else $correcto=0; ?>Imagino que se entiende bien, pero ni es suficiente ni funciona (y esto es lo que me ha traido mosqueado). Obviamente los robots spammers no van a abrir una sesión, con lo que no generan $_SESSION[captcha], tampoco rellenarán $_POST[captcha_form] así que la condición se cumple y se asume el comentario como correcto (¡estúpido de mi!). Un pequeño parche que por el momento está funcionando es agregar otro condicionante:
<?php if($_SESSION[captcha]==$_POST[captcha_form] AND strlen($_SESSION[captcha])!='0' AND strlen($_POST[captcha_form])!='0') $correcto=1; else $correcto=0; ?>El funcionamiento es básico y seguro que está explicado con más chicha en miles de sitios, así que esta ha sido mi pequeña aportación al mundo-captcha. ¿Alguien se anima a mejorarlo?.
Actualización
Juanjo ha enviado un ejemplo de mi captcha a una dirección (http://captcha.megaleecher.net/) en la que tratan de descifrar el texto usando PHP, el resultado ha sido satisfactorio, ya que no han logrado 'leer' la clave.
Comentarios
Un abrazo socio, espero que la vuelta a la vida cotidiana sea lo más leve posible.
¡Saludos co!.