Tip sencillo para evitar el SPAM en formularios
Fecha: 12-jul-2010 | Autor: Marcelo Ferreiro.
Guardado en: Desarrollo Web
La semana pasada me registré en Forrst.com, una red social de diseñadores y desarrolladores web (en Inglés), y me topé con un tema que ya hace tiempo había visto en un blog y me pareció super interesante, y dado que ésto me lo recordó ahora, decidí postearlo aquí ;)
Es bien sabido, que todos deseamos evitar el SPAM en formularios de contacto o de comentario, pero a veces los CAPTCHAS se tornan un poco molestos o complejos para los usuarios, y hasta los hay que optan por evitar comentar o contactarnos al ver que deben completar captchas que muchas veces no funcionan del todo correcto.
Hay una forma mucho más sencilla para poder detectar si un formulario está siendo completado por un bot automático dedicado a llenar nuestras casillas de correo y nuestros blogs de SPAM, y tan sólo es necesario utilizar HTML y CSS, veamos como…
La idea es agregar en nuestro formulario, un campo de texto extra (llamado por ejemplo verificacion; o como prefiramos) y ocultarlo mediante CSS. De esta forma los usuarios no lo verán y no lo completarán. En cambio un bot automático sí que llenará el campo, de modo que luego, antes de guardar el comentario o enviar el correo, solo debemos comprobar que el campo verificacion esté vacío y en caso de no estarlo, no proceder. Veamos esto con un ejemplo de código:
1 2 3 4 5 6 7 8 9 10 11 | <form method="post" action="enviar.php"> <label for="nombre">Nombre:</label> <input name="nombre" value="" size="20" /> <label for="email">Email:</label> <input name="email" value="" size="25" /> <label for="verificacion" class="verif">¡Si ves esto, no llenes el siguiente campo!</label> <input name="verificacion" class="verif" /> <input type="submit" value="Enviar" /> </form> |
Ese sería el código HTML del formulario, que se complementaría con el siguiente código CSS para evitar que el campo verificacion se muestre. Notar que de todas formas incluyo una etiqueta (también oculta por CSS) para evitar que un usuario que navegue con CSS deshabilitado complete dicho campo ;)
1 | .verif{ display: none; } |
Con esa línea de CSS definimos que el campo verificacion (y su label) no sean visibles.
Y por último, a la hora de procesar el formulario, debemos tener en cuenta que el campo verificacion no esté completado:
1 2 3 4 5 6 7 8 | <?php if ($_POST['verificacion'] != ""){ // Es un SPAMbot exit(); }else{ // Es un usuario real, proceder a enviar el formulario. } ?> |
Bueno, ahora solo resta que vayas a proteger tus formularios! ;)

Lucas
12. jul, 2010
Interesante, lo voy aponer en práctica en alguno de mis blogs (de seguro en el que más spam me netra xD ) a pesar de tener un captcha, sigue entrando spam.
Gracias Marcelo por este tip :)
ign
12. jul, 2010
Lo había visto también hace un tiempo y es una excelente idea. Aún mejor si en vez de verificador, ponés un nombre como “last_name”, por decir algo.
La única desventaja es que si bien es un excelente método (lo tengo andando en una web hace meses y jamás llegó spam) es infinitamente fácil de romper si llegara a masificarse. Es decir, es efectivo mientras los bots no sepan que se usa, o mejor dicho, mientras no lo use mucha gente.
mltulian
12. jul, 2010
Muy buen metodo que no se me habia ocurrido ni lo habia visto. Tiene razon @ign, pero por lo pronto, es lo que considero mas efectivo y sencillo para el usuario.
Pollofrito
17. jul, 2010
También queda la opción de un CAPTCHA propio, es decir una serie de imágenes con palabras nada deformadas, que rotarán y el script verificaría que coincide con , por ejemplo, 1 de las 10 posibles.
El autor del post tiene razón…. los CAPTCHAS automáticos son terribles, son miles de veces las que no he conseguido entender la palabra o se me pasó algún carácter y te cansa y se te quitan las ganas de responder posts o artículos.
ricardo
28. jul, 2010
Hola buenas, voy utilizar el método ahora mismo. He sufrido en mi web ingresos constantes de comentarios con links a páginas de viagra y estoy harto, le puse la opción de moderar (porque el capcha se lo saltaba sin problemas) yo lo comentarios antes de incluirlos pero cada vez que abro mi correo me encuentro los 5 o 6 correos del spambot.
un saludo y os cuento que tal si funciona bien os lo haré saber.
un saludo y muchas gracias.
ricardo
29. jul, 2010
Hola buenas, el método me ha funcionado perfectamente,
enhorabuena y muchas gracias.
PuroVIVE!
22. ago, 2010
Gracias man…..te lo agradesco mucho…mi sitio habia sido invadido por mucho spam…..y con esto he quedado mas que feliz!!!!!
GRACIAS!!!
HogoJp
13. dic, 2010
Yo uso un sistema muy parecido y por ahora no tengo queja jeje. Lo que hago es poner un campo input para el nombre de usuario con el name=”" nombre y otro con el valor name, el segundo le meto un display none y pista, misma comprobación que dices en el artículo, y hasta ahora 0 spam :)
Claudio
27. may, 2011
Excelente idea!. De todas formas el mayor problema es la masificación. Hasta ahora solo he tenido un mensaje como SPAM así que voy a probar con otros métodos y si no funciona voy con este. Excelente aporte.
Marcelo
30. may, 2011
Me alegro que a varios les haya resultado útil… y es verdad que la masificación puede devenir en que los spammers se carguen este método, pero eso siempre sucede, como sucedió con los primeros captchas… y es por eso que día a día terminan siendo más complejos :S
Saludos!
yaqui
29. jun, 2011
estoy haciendo pruebas para un cliente pero me encontrado con la desgracia de que tiene que sera en ASP. ¿Alguna forma sencilla de convertir el codigo?
Maximiliano Jiménez
09. sep, 2011
Genial. Muchas gracias.
sergio
26. sep, 2011
Muchas gracias, acabo de implementar tu solución a mi sitio web, espero que funcione ya que he creado una especie de muro de comentarios y me lo petan de span del puto viagra, dentro de unos días te dire si me ha funcionado.
Normalmente las soluciones mas sencillas son las mejores…
Marcelo
26. sep, 2011
Hola Sergio, espero que te sirva…
Yo justo la semana pasada volví a aplicarlo en una web que tenía mucho SPAM y logró reducirlo en aprox. un 90% ;)
Suerte!
Arturo
27. sep, 2011
Excelente tip!
Sergio
04. oct, 2011
Aupa Marcelo!!!, muy buena tu solución, llevo más de una semana y ni un span!!!, muchas gracias de nuevo.
Marcelo
04. oct, 2011
Me alegro Sergio que a tí también te haya funcionado ;)
Claudio
06. oct, 2011
Se me ocurrió algo así al pasar, que tal si a esto, que por cierto es muy útil, le modificamos esto: que el campo oculto se llame nombre y el campo que realmente tiene el nombre se llame de otra forma, por ej nombbrree. Para qué? para que al poner oculto un campo con nombre popular el bot lo complete cosa que con el nombre verificacion puede que viendo este caso lo contemplen y dejen de completar. Es más, yo le agregaría dos campos ocultos: nombre y name, quien quiera hacer spam los completa de cabeza. Espero que se haya entendido.
Claudio
09. nov, 2011
Les cuento que, por lo menos el que me hace spam a mi, pasa por alto este truco. Para mi que usa algo que rellena los formularios en el navegador en vez de mandar los datos mediante un robot…
p3ru
09. feb, 2012
+1
Nano
10. feb, 2012
Muy buenoooo!
mario
09. mar, 2012
que les parece la idea de: preguntar cuanto es la suma de 2+5 por ejemplo… o una resta…y comprobar en el servidor el resultado correcto con PHP ?
u oooootra idea MEJOR, hacer tipo un timer ni bien se genera la pagina del lado del usuario, y si por ejemplo pasan mas de 30 segundos desde que el usuario visualizó la pagina hasta el instante en q el comentario es enviado entonces ahi si seria válido en el sentido de que un humano tardaria un buen rato en leer el post y completar todos los datos mientras un bot lo hace en unos segundos…. ESPERO SE ME ENTIENDA
se carga la pagina
comienza a correr el timer
si tiempo es menor que 30 segundos
marcar comentario como posible SPAM…
simple…
Marcelo
12. mar, 2012
Hola Mario, son buenas ideas también las que comentas! :D Gracias por compartirlas!
Claudio
13. mar, 2012
Mario la segunda idea me parece maravillosa!. Casi no sería molestia para el usuario pero el bot no lo podría detectar además que al estar en JavaScrip menos aún.
Marcelo
14. mar, 2012
La contra es que al ser Javascript, justamente no pararíamos a ningún bot, ya que suelen navegar con javascript desactivado :/
Claudio
14. mar, 2012
Mejor aún, si el formulario lo generamos por Javascript al navegar desactivado no verían ningún formulario y hasta se puede simular como que no hay ningún formulario para que no vuelvan a intentarlo.
mario
19. abr, 2012
la idea es COMBINAR todas estas ideas…. ¿se puede hacer algo parecido a un timer con PHP del lado del servidor?
Tal vez, usando $_SESSION… la verdad no comprendo muy bien como usar esa variable, vengo de Java donde se pueden hacer maravillas con las sessions sin necesidad de cookies.
Por eso pregunto a los capos en PHP acá si existe posibidad de implementar una suerte de “timer” con php. Saludos! muy bueno el blog y la onda de la monada acá….
mario
19. abr, 2012
sino: setear a 0 una variable “hidden” en html
SI al enviar esa variable al servidor sigue en cero ENTONCES
es SPAM
si variable= “ee22″ (p.e que solo el servidor “sepa” el valor q sera correcto)
entonces no es spam,
el valor de la variable hidden se cambia por JScrip cuando corre el timer, si el bot desactiva JScript siempre sera cero…
ideas para safar del “fuckin” captcha
marcelo (dueño del blog): al enviar el formulario este q estoy usando y no poner mi mail SE ME BORRÓ TODO EL COMENTARIOOOOOOOOOOO!!!!
Dweb3d.com
06. jul, 2012
Muy buen artículo, es una gran tip para evitar el spam, no lo conocía, muy recursivo aporte definitivamente.
Michel
07. nov, 2012
pues no me funciono :(
aun me siguie llegado mucho spam en un sitio que tengo
por que podria ser?
no sera algun virus en el servidor o algo asi?
CAPTCHA: Cuando la Seguridad Atenta Contra la Accesibilidad « Informática y Accesibilidad para Todos
12. nov, 2012
[...] a las soluciones basadas en CSS, Marcelo Ferreiro ofrece en su artículo Tip sencillo para evitar el spam en formularios, una alternativa que toma en cuenta a usuarios que utilicen agentes de usuario que no interpreten [...]
Alejandro Santamaría
15. ene, 2013
Muchas gracias, sencillo y muy efectivo. =)
yaquiestoya
09. mar, 2013
Me funciono. Muchas gracias
Fernnado
22. mar, 2013
Jeeje buen dato, buena explicación de bot que lo llena asta el campo oculto jeje eso lo implementare a mi web ya me aburrió recibir mucho spam departe de estos robots maliciosos
raul
18. abr, 2013
modifique un poco este formulario no use css
lo hize todo en html poniendo un campo invisible
lo llame nada y en la validacion de php le puse validar el campo nada y va funcionando !