PHP:¿Cómo puedo evitar los posts de bots y/o spammers en mi sistema de formularios? (Captcha)

De Foros del Web

Hola, les dejo una solución que acabo de crear:

consta de tres archivos: formulario.php, texto_a_imagen.php y la_fuente.ttf.


formulario.php

Código PHP:

<?php 
session_start(); 
if (!isset($_SESSION['captcha']) || empty($_SESSION['captcha'])) 
{ 
    // Si no hay código de seguridad... 
    $_SESSION['captcha'] = substr(md5(time().microtime()), 0, 8); // Creo código de seguridad aleatorio 
} 
 
if ($_POST['submit']) 
{ 
    if ($_POST['codigo_seguridad'] != $_SESSION['captcha']) 
    { 
        // Posible BOT Spammer en nuestro sistema 
        unset($_SESSION['captcha']); // Borro la clave captcha para que al recargar la página se crée una nueva 
        $_SESSION['mensaje_error'] = 'No has escrito bien el código de seguridad'; // Asigno un mensajito 
        header('Location: '.$_SERVER['PHP_SELF']); // Redirecciono a la misma página 
        exit(); // Nos asegurames que el script termine acá 
    } 
 
    // Ponemos el código de nuestro interés. 
    echo '<p>No eres un bot, o al menos eso nos hiciste creer :P</p>'; 
} 
 
// -- Fin del sistema anti-bot 
 
if ($_SESSION['mensaje_error']) 
{ 
    echo '<p>'.$_SESSION['mensaje_error'].'</p>'; 
    unset($_SESSION['mensaje_error']); 
} 
?> 
 
<form method="post" action="<? echo $_SERVER['PHP_SELF']; ?>"> 
    <fieldset> 
        <legend>Formulario</legend> 
        <label for="email">E-mail:</label> 
        <input type="text" name="email" id="email" /> 
 
        <label for="clave">Clave:</label> 
        <input type="password" name="clave" id="clave" /> 
 
        <label for="captcha">C&oacute;digo de seguridad:</label> 
        <img src="texto_a_imagen.php" id="captcha" /> 
 
        <label for="codigo_seguridad">Repetir c&oacute;digo de seguridad:</label> 
        <input type="text" name="codigo_seguridad" id="codigo_seguridad" /> 
    </fieldset> 
    <input type="submit" name="submit" value="Continuar" /> 
</form> 

texto_a_imagen.php

Código PHP:

<?php 
session_start(); 
 
$texto = $_SESSION['captcha']; // Tomo el código de seguridad creado en formulario.php 
$fuente = 'amaze.ttf'; 
$fuente_tamano = 21; 
 
$ancho = 110; 
$alto = 35; 
 
$img = imagecreate($ancho, $alto); 
imagecolorallocate($img, 255, 255, 255); // Color del fondo 
 
$color_texto = imagecolorallocate($img, 138, 190, 77); // Color del texto 
imagettftext($img, $fuente_tamano, 0, 5, 26, $color_texto, $fuente, $texto); 
 
header('Content-type: image/png'); 
imagepng($img); 
imagedestroy($img); 
?> 

Espero les sea útil ;)

Les dejo el link comprimido de los 3 archivos por si a alguien le interesa ;)

php_captcha.7z (37 KB)

php_captcha.zip (43 KB)



--nachopro 28 Ago 2007

Este artículo es parte de las FAQs de PHP y el Manual de PHP.

Herramientas personales