Jak vytvořit jednoduchý honeypot pro ochranu formulářů před spammery
Myslím, že tento příspěvek bude krátký a užitečný. Jeho cílem je ukázat jednoduchou techniku, která vám pomůže zablokovat spammery a roboty, kteří by mohli napadnout formuláře vašich webových stránek. Má to být další vrstva v prevenci proti spamu, nikoli hlavní zdroj k. Používejte jej spolu s dalšími nástroji, jako je re apod. Vzhledem k jeho jednoduchosti vám opravdu doporučuji dodržovat tento vzor formuláře, takže, pojďme kódovat:
Představte si, že máte následující strukturu formuláře:
<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>
Většina jednoduchých botů bude hledat společné vzory formuláře, jako jsou společné názvy štítků, vstupní id, vstupní společné atributy, povinná pole atd. a pak je bot vyplní falešnými informacemi, aby se pokusil odeslat vám a vašim zákazníkům spamy nebo nějaké škodlivé kódy. Nejčastěji se hledají pole s názvy jako „e-mail, telefon, adresa“…
Takže, pojďme to ošidit a vytvořit jednoduchý honeypot tím, že změníme strukturu našeho formuláře na:
<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>
Podívejme se na změny:
Nejprve jsme vytvořili třídu pro skrytí věcí. Třídu .ohnohoney. Důležité je nyní upozornit na některé věci:
-
Nepoužívejte display:none, někteří boti nemají přístup k polím s display none, jiní prostě vědí, že nemají vyplňovat pole display none. Nepoužívejte v názvu třídy „hidden“, někteří pokročilí boti to poznají.
-
Pak jsme vytvořili „Skutečná pole“. To jsou viditelná pole a ta, která musí být pro váš backend relevantní z hlediska dat. Tato pole musí mít identifikace změněné na hashe. Běžně používám vzor „nameHASH“ vše dohromady. Nepoužívejte „name-hash“ nebo jeho variace, jednoduché rozdělení by odhalilo skutečný název pole. Nyní bot nepozná, co jsou tato pole zač, pouze ví, že formulář má nějaká pole, která je třeba vyplnit, třeba podle vzoru „typ“.
-
Vytvořením polí „h o n e y p o t“ budeme schopni identifikovat spammera. Důležité pro: Nechte štítek prázdný, použijte svou třídu „ohnohoney“, abyste skryli všechny tyto falešné vstupy. Udělejte ze svých falešných vstupů co nejjednodušší, nejobecnější a nejatraktivnější. Používejte jednoduché a běžné názvy jako „e-mail, telefon, jméno atd.“, zakažte automatické dokončování (aby je prohlížeč nevyplňoval), zakažte pravidla, ale zachovejte typy.
Nyní máme v našem formuláři dvě části: Skutečná pole s našimi vstupy chráněná hashem a podivnými názvy (hash nebo podivné názvy můžete implementovat podle svých preferencí). A náš honeypot (nepište „honeypot“, raději rozdělte písmena, abyste se vyhnuli případnému rozpoznání). Nyní na svém backendu:
- Ověřte, zda se vyplnilo některé z polí „h o n e y p o t“. Pokud ano, gratulujeme, zachytili jste spam. Většina z nich vyplní všechna tato pole bez rozlišení. Stačí tedy zkontrolovat, zda se vyplnilo některé z polí „h o n e y p o t“, pokud ano, jedná se o spam. Pokud chcete, můžete tuto kontrolu provést na klientovi, v případě ajaxového formuláře se tím vyhnete použití prostředků serveru na výpočet nepoužitelných dat (ale stejně zachováte backendovou validaci). Když zachytíte spam, prostě data neodesílejte a dělejte si s nimi, co chcete. Pokud jsou pro váš backend důležitá jména jako „e-mail, telefon atd.“, prostě je přepisujte pomocí polí.
Tady je repozitář s jedním souborem a jednoduchou implementací této techniky:
https://github.com/felippe-regazio/php-honeypot-example
Pamatujte: je to jen jednoduchá vrstva, která má jednoduchým způsobem zabránit útokům, některé technologie dokáží identifikovat i tyto vzory, takže proti nim použijte všechny zbraně, které můžete. Věřím však, že tento jednoduchý vzor dokáže zabránit minimálně 50 % spamů na vaší webové stránce.