Cómo crear un simple Honeypot para proteger tus Formularios contra Spammers

Creo que este post será corto y útil. El objetivo aquí es demostrar una técnica simple para ayudarle a bloquear los spammers y bots que podrían atacar sus formularios del sitio web. Esto significaba ser una capa extra en la prevención de spam, no el recurso principal para. Utilícelo con otras herramientas como re, etc. Debido a su simplicidad, realmente recomiendo seguir este patrón de formulario, así que, vamos a codificar:

Imagina que tienes la siguiente estructura de formulario:

<form action="/myformaction"> <label for="name">Your Name</label> <input type="text" name="name" placeholder="Your name here" required maxlength="100"> <label for="email">Your E-mail</label> <input type="email" name="email" placeholder="Your e-mail here" required></form>

La mayoría de los bots simples buscarán patrones comunes en los formularios, como los nombres comunes de las etiquetas, los identificadores de entrada, los atributos comunes de entrada, los campos requeridos, etc, y entonces el bot los llenará con información falsa para tratar de enviarte a ti, y a tus clientes, spam o algunos códigos maliciosos. Los campos más comunes a buscar son los campos denominados como «email, teléfono, dirección»…

Así que, vamos a engañar en eso y crear un simple honeypot cambiando la estructura de nuestro formulario a:

<style> .ohnohoney{ opacity: 0; position: absolute; top: 0; left: 0; height: 0; width: 0; z-index: -1; }</style><form action="/myformaction"> <!-- Real fields --> <label for="nameaksljf">Your Name</label> <input type="text" name="nameksljf" placeholder="Your name here" required maxlength="100"> <label for="emaillkjkl">Your E-mail</label> <input type="text" name="emaillkjkl" placeholder="Your e-mail here" required> <!-- H o n e y p o t --> <label class="ohnohoney" for="name"></label> <input class="ohnohoney" autocomplete="off" type="text" name="name" placeholder="Your name here"> <label class="ohnohoney" for="email"></label> <input class="ohnohoney" autocomplete="off" type="email" name="email" placeholder="Your e-mail here"></form>

Veamos los cambios:

Primero creamos una clase para ocultar cosas. La clase .ohnohoney. Es importante señalar algunas cosas ahora:

  1. No uses display:none, algunos bots no pueden acceder a los campos con display none, otros simplemente saben que no deben llenar los campos con display none. No uses «hidden» en el nombre de la clase, algunos bots avanzados pueden reconocerlo.

  2. Entonces creamos los «Real fields». Estos son los campos visibles y los que deben ser relevantes para su backend en términos de datos. Estos campos deben tener las identificaciones cambiadas a hashes. Comúnmente uso el patrón «nameHASH» todo junto. No use «name-hash» o variaciones de eso, una simple división expondría el nombre real del campo. Ahora, un bot no puede reconocer lo que son estos campos, sólo saben que el formulario tiene algunos campos que deben ser llenados, tal vez siguiendo el «tipo» como patrón.

  3. Al crear los campos «h o n e y p o t» seremos capaces de identificar al Spammer. Importante: Deja la etiqueta vacía, utiliza tu clase ‘ohnohoney’ para ocultar todas esas entradas falsas. Convierta su entrada falsa en la más simple, genérica y atractiva posible. Usa nombres simples y comunes como «email, teléfono, nombre, etc», desactiva el autocompletado (así, el navegador no lo rellenará), desactiva las reglas, pero mantén los tipos.

Ahora tenemos 2 partes en nuestro formulario: Campos reales con nuestros inputs protegidos por hashes y nombres extraños (puedes implementar el hash o los nombres extraños como prefieras). Y nuestro honeypot (no escribas «honeypot», prefiere dividir las letras para evitar cualquier reconocimiento). Ahora en su backend:

  1. Verifique si alguno de los campos de «h o n e y p o t» se llenó. Si es así, felicidades, has atrapado un spam. La mayoría de ellos llenarán todos estos campos sin diferenciarlos. Por lo tanto, todo lo que tienes que hacer es comprobar si alguno de tus campos «h o n e y p o t» se ha rellenado, si es así, es un spam. Si lo prefiere, puede hacer esta comprobación en el cliente, en el caso de un formulario ajax, esto evitará el uso de recursos del servidor para calcular datos inútiles (pero mantener la validación del backend de todos modos). Cuando atrapes un spam, simplemente no envíes los datos y haz lo que quieras con ellos. Si nombres como «email, teléfono, etc» son importantes para su backend, simplemente transcriba los nombres usando arrays.

Aquí hay un repo de un solo archivo con una implementación simple de esta técnica:
https://github.com/felippe-regazio/php-honeypot-example

Recuerde: esto es sólo una capa simple para prevenir ataques de una manera simple, algunas tecnologías pueden identificar incluso estos patrones, así que use todas las armas que pueda contra ellos. Pero creo que este simple patrón puede evitar al menos el 50% de los spams en su página web.