Hur du skapar en enkel Honeypot för att skydda dina formulär mot spammare
Jag tror att det här inlägget kommer att vara kort och användbart. Målet här är att demonstrera en enkel teknik som hjälper dig att blockera spammare och botar som kan attackera dina webbplatsformulär. Detta är tänkt att vara ett extra lager i förebyggande av skräppost, inte den huvudsakliga resursen till. Använd den tillsammans med andra verktyg som re osv. På grund av dess enkelhet rekommenderar jag verkligen att du följer det här formulärmönstret, så låt oss koda:
Föreställ dig att du har följande formulärstruktur:
<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 flesta enkla botar kommer att söka efter gemensamma mönster i formuläret, som gemensamma namn på etiketter, inmatnings-id, gemensamma attribut för inmatning, obligatoriska fält etc., och sedan kommer botaren att fylla dem med falsk information för att försöka skicka dig och dina kunder skräppost eller någon skadlig kod. De vanligaste fälten att söka i är fält som heter ”email, phone, address”…
Så, låt oss fuska med det och skapa en enkel honeypot genom att ändra vår formulärstruktur till:
<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>
Låt oss se ändringarna:
Först skapade vi en klass för att dölja saker. Klassen .ohnohoney. Det är viktigt att påpeka vissa saker nu:
-
Använd inte display:none, vissa robotar kan inte komma åt fält med display none, andra vet helt enkelt att de inte ska fylla display none-fälten. Använd inte ”hidden” i klassnamnet, vissa avancerade robotar kan känna igen det.
-
Därefter skapade vi ”riktiga fält”. Detta är de synliga fälten och de som måste vara relevanta för din backend när det gäller data. Dessa fält måste ha identifieringarna ändrade till hash. Vanligtvis använder jag mönstret ”nameHASH” alla tillsammans. Använd inte ”name-hash” eller varianter av det, en enkel uppdelning skulle avslöja det verkliga fältnamnet. Nu kan en bot inte känna igen vad dessa fält är, de vet bara att formuläret har några fält som måste fyllas i, kanske enligt mönstret ”type”.
-
Genom att skapa fälten ”h o n e y p o t” kommer vi att kunna identifiera spammare. Viktigt att: Låt etiketten vara tom, använd din ”ohnohoney”-klass för att dölja alla falska inmatningar. Gör din falska inmatning så enkel, generisk och attraktiv som möjligt. Använd enkla och vanliga namn som ”email, phone, name, etc.”, inaktivera autokomplettering (så att webbläsaren inte fyller i den), inaktivera regler, men behåll typerna.
Nu har vi 2 delar i vårt formulär: Riktiga fält med våra inmatningar som skyddas av hash och konstiga namn (du kan implementera hash eller konstiga namn som du vill). Och vår honeypot (skriv inte ”honeypot”, utan dela upp bokstäverna för att undvika igenkänning). Nu på din backend:
- Kontrollera om något av ”h o n e y p o t”-fälten fylldes. Om ja, grattis, du har fångat en skräppost. De flesta kommer att fylla alla dessa fält utan att skilja dem åt. Så allt du behöver göra är att kontrollera om något av dina ”h o n e y p o t”-fält har fyllts, om ja är det en skräppost. Om du föredrar det kan du göra denna kontroll på klienten, om det rör sig om ett Ajax-formulär. På så sätt undviker du att använda serverresurser för att beräkna oanvändbara data (men behåller ändå valideringen i backend). När du upptäcker en skräppost skickar du bara inte uppgifterna och gör vad du vill med dem. Om namn som ”email, phone, etc” är viktiga för din backend, transkribera bara namnen med hjälp av arrays.
Här finns en enkel fil med en enkel implementering av den här tekniken:
https://github.com/felippe-regazio/php-honeypot-example
Håll dig i minnet: detta är bara ett enkelt lager för att förhindra attacker på ett enkelt sätt, vissa tekniker kan identifiera även dessa mönster, så använd alla vapen du kan mot dem. Men jag tror att detta enkla mönster kan undvika minst 50 % av spams på din webbsida.