Tip sencillo para evitar el SPAM en formularios

Tip sencillo para evitar el SPAM en formularios

Fecha: 12-Jul-2010 | Autor: .
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:


¿Por qué este anuncio?
<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 ;)

.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:

<?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! ;)


Si te gustó, comparte:
Y si fue de ayuda, puedes comprarme un café:
...ó la cena si quieres! ;)

Etiquetado como: , , , ,


Gravatar

Marcelo


Desarrollador web, trabajando desde Montevideo, Uruguay para todo el mundo. Me especializo en Diseño web, Maquetación HTML5 & CSS3, jQuery y Programación PHP & MySQL, e intento aprender un poco más cada día.

50 comentarios, participa!

  1. 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 :)

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. ricardo

    29. Jul, 2010

    Hola buenas, el método me ha funcionado perfectamente,
    enhorabuena y muchas gracias.

  7. 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!!!

  8. 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 :)

  9. 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.

  10. 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!

  11. 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?

  12. Maximiliano Jiménez

    09. Sep, 2011

    Genial. Muchas gracias.

  13. 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…

  14. 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!

  15. Arturo

    27. Sep, 2011

    Excelente tip!

  16. 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.

  17. Marcelo

    04. Oct, 2011

    Me alegro Sergio que a tí también te haya funcionado ;)

  18. 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.

  19. 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…

  20. p3ru

    09. Feb, 2012

    +1

  21. Nano

    10. Feb, 2012

    Muy buenoooo!

  22. 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…

  23. Marcelo

    12. Mar, 2012

    Hola Mario, son buenas ideas también las que comentas! :D Gracias por compartirlas!

  24. 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.

  25. 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 :/

  26. 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.

  27. 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á….

  28. 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!!!!

  29. 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.

  30. 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?

  31. […] 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 […]

  32. Alejandro Santamaría

    15. Ene, 2013

    Muchas gracias, sencillo y muy efectivo. =)

  33. yaquiestoya

    09. Mar, 2013

    Me funciono. Muchas gracias

  34. 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

  35. 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 !

  36. Adrián

    30. Jul, 2013

    Buenas…

    La idea origina es muy buena y funciona perfectamente.

    Como soy algo paranoico, le he dado uan vuelta de tuerca:

    Del lado servidor tengo un array con varios nombres del campo y distintas leyendas alternativas a: “¡Si ves esto, no llenes el siguiente campo!”. De esta forma logro que si alguien “espia” el formulario para ver que NO llenar o busca lago “conocido por masificado” tiene menos opcioens de hallarlo.

  37. Joe

    10. Ago, 2013

    Gracias! funciona a la perfección!

  38. ale

    25. Nov, 2013

    no me funciona porque el spam bot solo esta llenando algunos campos, otros los deja libre.
    Mi formulario tiene

    Nombre:
    Empresa:
    CUIT:
    Direccion:
    Localidad:
    País:
    Telefono:
    Email:
    Asunto:
    Mensaje:

    y el bot solo llena

    Nombre:
    Telefono:
    Email:
    Mensaje:

    Hice el campo “verificacion” como se explica aca pero al parecer el bot no lo llena, entonces no funciona. Si le pongo “Nombree” con 2 e, funcionara?

  39. Marcelo

    25. Nov, 2013

    Hola ale, a mi en casos puntuales con algún bot que me generara problemas del estilo lo que me ha servido fue usar como name del campo de verificación algo como “name” o “email”, y luego en el campo que quiero que el usuario llene su nombre ponerle “nombre_usuario” o algo así, y simplemente dejar que el bot reyene el “name” o el que busque por defecto ;)

  40. Carlos

    10. Feb, 2014

    esta parte va en el php que procesa el formulario?
    o antes dentro del fomulario?
    gracias, saludos

  41. RECKAH_DOG

    14. Mar, 2014

    Todos esos métodos son facilmente destructibles, el metodo mas efectivo es mostrar imágenes que solamente la mente humana pueda procesar, por ejemplo, mostrar una imagen de un loro y pedir al usuario que escriba el nombre de lo que ve en el dibujo. Cuanto mas grande sea la base de datos de imagenes,menor probabilidad de spam existe, de hecho practicamente nula. Incluso seria interesante realizar la operación que ha comentado otro usuario, mostrar una pequeña operación matemática y que el usuario marque el resultado.

  42. Mariana

    21. Mar, 2014

    Excelente, ya lo puse a prueba vamos a esperar a ver si me sigue llegando ese molesto spam de aol….

  43. Danilo

    29. Mar, 2014

    No funciona, el spam continua y tambien recibo mensajes en blanco

  44. Marcelo

    30. Mar, 2014

    Es verdad Danilo, yo tengo un par de Sitios en los que no me funcionó, pero otros varios en los que sí me solucionó el problema.

    Lo ideal quizá es en los casos que no parece frenar el 100% de los bots, incluir un captcha o alguna pregunta para verificar que quién complete el formulario sea un usuario real.

  45. Cristian

    25. Sep, 2014

    es posible lo siguiente?

    por ejemplo:

    tomar la hora del servidor y meterla en una variable
    extraer 1 numero a la derecha del minuto y lo mismo del segundo y guardar en variables (min / seg)
    sumarlos y guardar en variable (total)
    poner como texto : “min + seg”
    pedir al usuario que sume y comparar su resultado con total

  46. Marcelo

    25. Sep, 2014

    Cristian, esa puede ser una buena idea, aunque implica acción de parte del usuario (a diferencia del post original, que la idea es que sea “transparente” de cara al usuario).

    Pero creo que sería una buena forma de evitar bots! ;)

  47. Cristian

    26. Sep, 2014

    Marcelo,

    Incorporé tú validador Css, pero quiero agregar un validador adicional, que no sea complejo y que sea de fácil ingreso para el usuario y como no se mucho de bots, tengo la sgte. duda:

    Si en el mismo formulario armo una variable con datos obtenidos de los minutos y segundos de la hora del servidor, por ejemplo 5348 y la incluyo como parte de este, es decir:

    ——————————————————–
    nombre [ ]
    e-mail [ ]
    mensaje [ ]
    Ingrese Verificación 5348 [ ]
    [Enviar]
    ——————————————————–
    Pregunta:
    ¿El bot recorre el código y genera la misma operación y es capaz de ingresar el valor? o ¿solo rellenará el input con valores al azar?.

    De ser lo segundo tenemos 2 simples validadores y el usuario no tuvo interrupción después de pinchar [Enviar].
    (Salvo que escriba mal el número)

    Gracias, y espero haberme hecho entender

  48. Nicolas

    05. May, 2015

    Genial, me ayudo bastante.
    Gracias

  49. Kevin Loui

    22. Oct, 2015

    Hola Marcelo, te cuento que tengo conocimientos muy generales en cuanto a html, normalmente trabajo sobre plantillas en dreamweaver, el asunto que tome el trabajo de un ex compañero y la pagina al ser publicada, su formulario comenzó a recibir un spam muy insistente que enviaba correos sin texto incluso si los campos debían llenarse obligadamente. Final del cuento que descubrí este post. Y dentro de mi poca experiencia, no tan poca la verdad, solamente duplique un campo y lo remplaze por el que habia que dejar invisible, aplique el estilo css y con ayuda de un amigo con mayor conocimiento hizo agregar mi archivo.php al que publicaste tú para hacer uno solo… sinceramente espero haya funcionado, porque de momento la pagina estuvo linkeada a mi correo para ver si llegaba algo y llene los datos visibles y me llegaban sin problema a mi correo. Han habido muy buewnas referencias en lso comentarios asi que no dudo en que resulte bien, sobre todo porque lo que le explique a mi entendido al tema me entendio y no lo deje mariado jajaja, saludos Marcelo y gracias

  50. Min

    19. Ene, 2016

    Muy buena idea, incorporé además la idea de cristian porque me pareció mucho más segura.

    Antes del formulario, realicé la siguiente operación:

    En el formulario agregué lo siguiente

    Verificación
    Cuánto es + ?

    Y la variable $sumvalid2 la envío escondida, ya que con ella debo comparar el resultado del usuario con esta

    <input name="resultvalidx" class="verif" id="resultvalidx" value="” />

    En el archivo que procesa solo me resta hacer la lógica

    $campvalid1 = security($_POST[‘validosuma’]);
    $campvalid2 = security($_POST[‘resultvalidx’]);

    if ($campvalid1 != $campvalid2) {
    echo “La suma de verificación está errada
    Regresar para corregir
    “;
    exit();
    }
    else { // proceso el formulario…

    Espero les ayude.
    Dios les bendiga

Deja tu opinión