Hoe maak je een eenvoudige Honeypot om je formulieren tegen spammers te beschermen

Ik denk dat deze post kort en nuttig zal zijn. Het doel is om een eenvoudige techniek te demonstreren waarmee je spammers en bots kunt blokkeren die je website-formulieren kunnen aanvallen. Dit is bedoeld als een extra laag in spam preventie, niet de belangrijkste bron te zijn. Gebruik het samen met andere tools zoals re, etc. Vanwege de eenvoud, ik echt raden u aan om dit formulier patroon te volgen, dus, laten we code:

Stel je voor dat je het volgende formulier structuur:

<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 meeste eenvoudige bots zal zoeken formulier gemeenschappelijke patronen, zoals label gemeenschappelijke namen, input id’s, input gemeenschappelijke attributen, verplichte velden, enz., en dan de bot zal vullen ‘em met valse info om te proberen u, en uw klanten, spam of een aantal kwaadaardige codes te sturen. De meest voorkomende velden om in te zoeken zijn velden met namen als “email, telefoon, adres”…

Dus, laten we eens vals spelen en een simpele honeypot maken door de structuur van ons formulier te veranderen 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>

Laten we eens kijken naar de veranderingen:

Eerst hebben we een klasse gemaakt om dingen te verbergen. De .ohnohoney klasse. Het is belangrijk om nu op een aantal dingen te wijzen:

  1. Gebruik geen display:none, sommige bots hebben geen toegang tot velden met display none, andere bots weten gewoon dat ze de display none velden niet moeten vullen. Gebruik geen “hidden” in de classnaam, sommige geavanceerde bots kunnen dit herkennen.

  2. Dan hebben we de “echte velden” gecreëerd. Dit zijn de zichtbare velden en de velden die relevant moeten zijn voor uw backend in termen van gegevens. Van deze velden moeten de identificaties worden veranderd in hashes. Gewoonlijk gebruik ik het patroon “nameHASH”. Gebruik niet “name-hash” of variaties daarop, een eenvoudige splitsing zou de echte veldnaam blootleggen. Een bot kan nu niet herkennen wat deze velden zijn, ze weten alleen dat het formulier een aantal velden heeft die ingevuld moeten worden, misschien volgens het “type” als patroon.

  3. Door de “h o n e y p o t” velden te maken kunnen we de Spammer identificeren. Belangrijk om: Laat het label leeg, gebruik je ‘ohnohoney’ klasse om al die nep-ingangen te verbergen. Maak je nep-ingang zo eenvoudig, algemeen en aantrekkelijk mogelijk. Gebruik eenvoudige en veel voorkomende namen als “email, telefoon, naam, etc”, schakel de autocomplete uit (zodat de browser deze niet invult), schakel de regels uit, maar behoud de types.

Nu hebben we 2 delen in ons formulier: Echte velden met onze input beschermd door hashes en vreemde namen (u kunt de hash of vreemde namen implementeren zoals u verkiest). En onze honeypot (niet schrijven “honeypot”, de voorkeur splitsen de letters om elke herkenning te voorkomen). Nu op je backend:

  1. Controleer of een van de “h o n e y p o t” velden gevuld is. Zo ja, gefeliciteerd, je hebt een spam gevangen. De meeste van hen zullen al deze velden vullen zonder ze te onderscheiden. Dus, alles wat je hoeft te doen is om te controleren of een van uw “h o n e y p o t” velden gevuld is, zo ja, dan is het een spam. Als je wilt, kun je deze controle op de client doen, in het geval van een ajax formulier, dit zal het gebruik van server resources om onnodige data te berekenen vermijden (maar de backend validatie toch behouden). Als je spam vangt, verstuur de gegevens dan niet en doe ermee wat je wilt. Als namen als “e-mail, telefoon, enz.” belangrijk zijn voor je backend, schrijf de namen dan gewoon over met behulp van arrays.

Hier is een single-file repo met een eenvoudige implementatie van deze techniek:
https://github.com/felippe-regazio/php-honeypot-example

Let op: dit is slechts een eenvoudige laag om aanvallen op een eenvoudige manier te voorkomen, sommige technologieën kunnen zelfs deze patronen identificeren, dus gebruik alle wapens die je ertegen kunt inzetten. Maar ik denk dat dit eenvoudige patroon ten minste 50% van de spams op uw webpagina kan voorkomen.