Come creare un semplice Honeypot per proteggere i vostri moduli dagli spammer
Penso che questo post sarà breve e utile. L’obiettivo qui è quello di dimostrare una semplice tecnica per aiutarvi a bloccare gli spammer e i bot che potrebbero attaccare i moduli del vostro sito web. Questo vuole essere uno strato in più nella prevenzione dello spam, non la risorsa principale. Usalo con un altro strumento come Re, ecc. A causa della sua semplicità, vi raccomando davvero di seguire questo modello di modulo, quindi, codifichiamo:
Immaginate di avere la seguente struttura di modulo:
<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 maggior parte dei semplici bot cercherà modelli comuni di modulo, come nomi comuni di etichette, id di input, attributi comuni di input, campi richiesti, ecc, e poi il bot li riempirà con informazioni false per cercare di inviare a voi, e ai vostri clienti, spam o qualche codice dannoso. I campi più comuni da cercare sono i campi chiamati come “email, telefono, indirizzo”…
Perciò, imbrogliamo su questo e creiamo un semplice honeypot cambiando la struttura del nostro modulo in:
<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>
Vediamo i cambiamenti:
Prima abbiamo creato una classe per nascondere le cose. La classe .ohnohoney. Importante sottolineare alcune cose ora:
-
Non usare display:none, alcuni bot non possono accedere ai campi con display none, altri semplicemente sanno che non devono riempire i campi con display none. Non usare “hidden” nel nome della classe, alcuni bot avanzati possono riconoscerlo.
-
Poi abbiamo creato i “Real fields”. Questi sono i campi visibili e quelli che devono essere rilevanti per il vostro backend in termini di dati. Questi campi devono avere le identificazioni cambiate in hash. Comunemente uso il modello “nameHASH” tutto insieme. Non usare “name-hash” o variazioni di questo, una semplice divisione esporrebbe il vero nome del campo. Ora, un bot non può riconoscere quali siano questi campi, sa solo che il form ha dei campi che devono essere riempiti, magari seguendo il “tipo” come pattern.
-
Creando i campi “h o n e y p o t” saremo in grado di identificare lo spammer. Importante: Lasciate l’etichetta vuota, usate la vostra classe ‘ohnohoney’ per nascondere tutti quegli input falsi. Rendi il tuo input falso il più semplice, generico e attraente possibile. Usate nomi semplici e comuni come “email, telefono, nome, ecc”, disabilitate il completamento automatico (così, il browser non lo riempirà), disabilitate le regole, ma mantenete i tipi.
Ora abbiamo 2 parti nel nostro modulo: I campi reali con i nostri input protetti da hash e nomi strani (potete implementare l’hash o i nomi strani come preferite). E il nostro honeypot (non scrivere “honeypot”, preferisco dividere le lettere per evitare qualsiasi riconoscimento). Ora sul vostro backend:
- Verificate se qualcuno dei campi “h o n e y p o t” è stato riempito. Se sì, congratulazioni, hai intrappolato uno spam. La maggior parte di loro riempirà tutti questi campi senza differenziarli. Quindi, tutto quello che dovete fare è controllare se qualcuno dei vostri campi “h o n e y p o t” è stato riempito, se sì, è uno spam. Se preferite, potete fare questo controllo sul client, nel caso di un modulo ajax, questo eviterà di usare risorse del server per calcolare dati inutili (ma mantenete comunque la validazione del backend). Quando prendete uno spam, semplicemente non inviate i dati e fatene quello che volete. Se i nomi come “email, telefono, ecc” sono importanti per il vostro backend, trascrivete i nomi usando gli array.
Qui c’è un repo a file singolo con una semplice implementazione di questa tecnica:
https://github.com/felippe-regazio/php-honeypot-example
Ricordate: questo è solo un semplice strato per prevenire gli attacchi in modo semplice, alcune tecnologie possono identificare anche questo pattern, quindi usate tutte le armi che potete contro di esso. Ma credo che questo semplice schema possa evitare almeno il 50% degli spam nella vostra pagina web.