Tema: FAQ's de PHP
Ver Mensaje Individual
  #183 (permalink)  
Antiguo 28/08/2007, 13:15
Avatar de nachopro
nachopro
 
Fecha de Ingreso: noviembre-2003
Ubicación: Haedo, Bs. As.
Mensajes: 290
Antigüedad: 20 años, 5 meses
Puntos: 2
Captcha para formularios

Tema: Captcha para formularios

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

Respuesta:

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()), 08); // 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($img255255255); // Color del fondo

$color_texto imagecolorallocate($img13819077); // Color del texto
imagettftext($img$fuente_tamano0526$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)