Muchas veces cuando creamos un sitio web, blog o foro lo que nunca falta son los famosos formularios de contacto con el webmaster o administrador del site y el gran problema que nos lleva una aplicación de este tipo son los molestosos mensajes de spam que nos llegan al correo, en su mayoría enviados desde robots de spam valga la redundancia, una de las soluciones más efectivas a este incómodo hecho es utilizar un sistema denominado CAPTCHA.

Lo que explicaré a continuación es la creación de un script -usando PHP claro está- que cree un código aleatorio alfanumérico y lo escriba en una imagen para la cual usaremos la librería GD de PHP. Pero antes de empezar vamos a definir lo que es en sí el sistema CAPTCHA.

Captcha es el acrónimo de Completely Automated Public Turing test to tell Computers and Humans Apart (Prueba de Turing pública y automática para diferenciar a máquinas y humanos).

La típica prueba consiste en que el usuario introduzca un conjunto de caracteres que se muestran en una imagen distorsionada que aparece en pantalla. Se supone que una máquina no es capaz de comprender e introducir la secuencia de forma correcta por lo que solamente el humano podría hacerlo (salvo error).

Definido lo que es el sistema CAPTCHA vamos al script en si y a su utilización, quiero dejar claro que este script no es propio, sólo lo he modificado para utilizarlo en este tipo de formularios(contacto al admin, libros de visita, comentarios, etc.).

Lo primero que haremos será crear el script que genere el código aleatorio y lo añada a una imagen que también crearemos usando como dije líneas arriba la librería gráfica GD de PHP.

A este archivo lo podemos llamar captcha.php

<?php
    session_start
();
    
    
// Genero el codigo y lo guardo en la sesión para consultarlo luego.
    
$captchaCode substr(sha1(microtime() * mktime()), 06);
    
$_SESSION['CAPTCHA_CODE'] = sha1($captchaCode);
    
    
// Genero la imagen
    
$img imagecreatetruecolor(7025);
    
    
// Colores
    
$bgColor imagecolorallocate($img230230230);
    
$stringColor imagecolorallocate($img909090);
    
$lineColor imagecolorallocate($img245245245);
     
    
// Fondo
    
imagefill($img00$bgColor);
    
    
imageline($img05705$lineColor);
    
imageline($img0107010$lineColor);
    
imageline($img0157015$lineColor);
    
imageline($img0207020$lineColor);
    
imageline($img1201225$lineColor);
    
imageline($img2402425$lineColor);
    
imageline($img3603625$lineColor);
    
imageline($img4804825$lineColor);
    
imageline($img6006025$lineColor);
    
    
// Escribo el código
    
imageString($img585$captchaCode$stringColor);
    
    
// Image output.
    
header("Content-type: image/png");
    
imagepng($img);
?>

Tal como lo ven estamos haciendo uso de las funciones para tratamiento de imágenes propias de PHP, las mismas que ustedes mismos pueden encontrar en el Manual Oficial de PHP

Ahora bien, ya tenemos creada la imagen con el código aleatorio, lo que sigue será crear nuestro formulario y en él insertaremos la imagen que hemos creado con su respectiva validación para que los datos sean enviados correctamente al email.

A este archivo podemos llamarlo contacto.php

<?php
    session_start
();
    if(isset(
$_POST['enviar'])) { 
        
$Message "";
        
$Captcha = (string) $_POST["CAPTCHA_CODE"];
        if(
$_POST['nombre'] == '') {
            echo 
"<p style='color: #ff0000;'><strong>No has ingresado tu Nombre.</strong></p>";
        }elseif(
$_POST['email'] == '') {
            echo 
"<p style='color: #ff0000;'><strong>No has ingresado tu Email.</strong></p>";
        }elseif(
$_POST['asunto'] == '') {
            echo 
"<p style='color: #ff0000;'><strong>No has ingresado el Asunto del mensaje.</strong></p>";
        }elseif(
$_POST['mensaje'] == '') {
            echo 
"<p style='color: #ff0000;'><strong>No has ingresado el Mensaje.</strong></p>";
        }elseif(
sha1($Captcha) != $_SESSION["CAPTCHA_CODE"]) {
            
$Message "<p style='color: #ff0000;'><strong>El c&oacute;digo de validaci&oacute;n no ha sido ingresado o es incorrecto.</strong></p>";
        }else {
            
mail ("tu_correo@tudominio.com""$asunto""$mensaje""From: $nombre <$email>"); // coloque aqui su correo 
            
echo '<p style="color: #63A915;"><strong>El email ha sido enviado con éxito.</strong></p>'
        }
    }
    if(!empty(
$Message)) {
        
// Muestro los posibles errores de validación previos.
        
echo "$Message";
    }
// Si aún no se han enviado los datos, mostramos el formulario
?>
<form method="post" action="contacto.php">
    <label>Nombre / Nick:</label>
    <input type="text" name="nombre" />
    <label>Email:</label>
    <input name="email" type="text" size="45" />
    <label>Asunto:</label>
    <input name="asunto" type="text" size="60" />
    <label>Mensaje:</label>
    <textarea name="mensaje" cols="80" rows="10"></textarea>
    <label>Código de seguridad:</label>
    <img src="captcha.php" /><input type="text" name="CAPTCHA_CODE" style="width: 50px;" />
    <p style="padding-top: 5px;">
    <input type="submit" name="enviar" value="Enviar Mensaje" />
    <input type="reset" name="enviar" value="Borrar datos" />
    </p>
</form>

Como se darán cuenta este último script lo que hace es mostrar el formulario con los campos solicitados además de la imagen CAPTCHA generada en el primer script, la cual hemos insertado usando la etiqueta xhtml <img /> la que nos devolverá el contenido binario de la imagen generada.

Una vez que se hayan enviado los datos lo primero que se hará será validar uno a uno los datos ingresados incluido el código del CAPTCHA para definir si lo que ingresó el usuario es el mismo que el que aparece en la imagen generada.

Listo, ya tenemos el formulario de contacto con el código CAPTCHA, ahora todo aquel usuario que quiera contactar con el webmaster o administrador deberá ingresar correctamente los datos para poder enviar correctamente el correo.