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()), 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ódigo de seguridad:</label>
<img src="texto_a_imagen.php" id="captcha" />
<label for="codigo_seguridad">Repetir có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)