Sådan opretter du en simpel Honeypot for at beskytte dine formularer mod spammere

Jeg tror, at dette indlæg vil være kort og nyttigt. Målet her er at demonstrere en simpel teknik til at hjælpe dig med at blokere spammere og bots, der kan angribe dine websideformularer. Dette ment til at være et ekstra lag i spam forebyggelse, ikke den vigtigste ressource til. Brug den sammen med et andet værktøj som re, osv. På grund af dens enkelhed anbefaler jeg virkelig, at du følger dette formularmønster, så lad os kode:

Forestil dig, at du har følgende formularstruktur:

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

De fleste simple bots vil søge efter formularens fælles mønstre, som f.eks. fælles navne på etiketter, input id’er, fælles attributter, obligatoriske felter osv., og derefter vil bot’en udfylde dem med falske oplysninger for at forsøge at sende dig og dine kunder spam eller ondsindede koder. De mest almindelige felter at søge i er felter med navne som “email, phone, address”…

Så, lad os snyde med det og skabe en simpel honeypot ved at ændre vores formularstruktur til:

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

Lad os se ændringerne:

Først skabte vi en klasse for at skjule ting. Klassen .ohnohoney. Vigtigt at påpege nogle ting nu:

  1. Brug ikke display:none, nogle bots kan ikke få adgang til felter med display none, andre ved blot, at de ikke skal udfylde display none felter. Lad være med at bruge “hidden” i klassens navn, nogle avancerede bots kan genkende det.

  2. Så har vi oprettet de “rigtige felter”. Dette er de synlige felter og dem, som skal være relevante for din backend med hensyn til data. Disse felter skal have identifikationerne ændret til hashes. Almindeligvis bruger jeg mønsteret “nameHASH” alle sammen. Lad være med at bruge “name-hash” eller variationer af det, en simpel opdeling ville afsløre det rigtige feltnavn. Nu kan en bot ikke genkende, hvad disse felter er, de er bare vide, at formularen har nogle felter, som skal udfyldes, måske efter “type” som mønster.

  3. Ved at oprette “h o n e y p o t” felter vil vi være i stand til at identificere Spammer. Vigtigt at: Lad etiketten være tom, brug din “ohnohoney”-klasse til at skjule alle de falske indgange. Gør dit falske input så simpelt, generisk og attraktivt som muligt. Brug enkle og almindelige navne som “email, telefon, navn osv.”, deaktiver autocomplete (så browseren ikke vil udfylde det), deaktiver regler, men behold typerne.

Nu har vi 2 dele i vores formular: Rigtige felter med vores input beskyttet af hashes og mærkelige navne (du kan implementere hash eller mærkelige navne, som du foretrækker). Og vores honeypot (skriv ikke “honeypot”, foretrækker at opdele bogstaverne for at undgå enhver genkendelse). Nu på din backend:

  1. Kontroller, om nogen af “h o n e y p o t”-felterne kom udfyldt. Hvis ja, tillykke, du har fanget en spam. De fleste af dem vil udfylde alle disse felter uden at differentiere dem. Så alt, hvad du skal gøre, er at kontrollere, om nogen af dine “h o n e y p o t”-felter blev udfyldt, hvis ja, er det en spam. Hvis du foretrækker det, kan du gøre dette tjek på klienten, i tilfælde af en ajax formular, dette vil undgå at bruge serverressourcer til at beregne ubrugelige data (men beholde backend validering alligevel). Når du fanger en spam, skal du bare ikke sende dataene og gøre hvad du vil med dem. Hvis navne som “email, telefon osv.” er vigtige for din backend, skal du bare transskribere navnene ved hjælp af arrays.

Her er en single-file repo med en simpel implementering af denne teknik:
https://github.com/felippe-regazio/php-honeypot-example

Husk: dette er bare et simpelt lag til at forhindre angreb på en simpel måde, nogle teknologier kan identificere selv dette mønster, så brug alle de våben du kan mod det. Men jeg tror, at dette enkle mønster kan undgå mindst 50% af spams på din webside.