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ó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)
--nachopro 28 Ago 2007
Este artículo es parte de las FAQs de PHP y el Manual de PHP.
- Indice de las FAQs: Conceptos, Configuración, Formularios, Manejo de Archivos, Integración con Bases de Datos, Sesiones, Extensiones y Librerías, Seguridad, Funciones, Clases y Objetos, Frameworks
- Recomendamos también: Guía Zend, Frameworks PHP, Aceleradores PHP
- Agregar al FAQ: PHP: Instrucciones para agregar una pregunta al FAQ de PHP
- Para preguntas sobre PHP: Foro de Php
