Jak stworzyć prosty Honeypot do ochrony Twoich formularzy przed spamerami

Myślę, że ten post będzie krótki i użyteczny. Celem jest tutaj zademonstrowanie prostej techniki, która pomoże Ci zablokować spamerów i boty, które mogą zaatakować formularze Twojej strony. To ma być dodatkowa warstwa w zapobieganiu spamu, a nie główny zasób. Użyj go z innymi narzędziami, takimi jak re, itp. Ze względu na jego prostotę, naprawdę polecam podążanie za tym wzorem formularza, więc, pozwól sobie zakodować:

Wyobraź sobie, że masz następującą strukturę formularza:

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

Większość prostych botów będzie przeszukiwać wspólne wzory formularzy, takie jak wspólne nazwy etykiet, identyfikatory danych wejściowych, wspólne atrybuty danych wejściowych, wymagane pola, itp, a następnie bot wypełni je fałszywymi informacjami, aby spróbować wysłać Tobie i Twoim klientom spam lub złośliwe kody. Najczęstszymi polami do przeszukiwania są pola o nazwach takich jak „email, telefon, adres”…

Oszukajmy więc to i stwórzmy prostego honeypota zmieniając strukturę naszego formularza 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>

Zobaczmy zmiany:

Początkowo stworzyliśmy klasę do ukrywania rzeczy. Klasę .ohnohoney. Ważne, aby teraz zwrócić uwagę na kilka rzeczy:

  1. Nie używaj display:none, niektóre boty nie mają dostępu do pól z display none, inne po prostu wiedzą, że nie powinny wypełniać pól z display none. Nie używaj „hidden” w nazwie klasy, niektóre zaawansowane boty mogą to rozpoznać.

  2. Następnie stworzyliśmy „Prawdziwe pola”. To są widoczne pola i te, które muszą być istotne dla Twojego backendu pod względem danych. Te pola muszą mieć zmienioną identyfikację na hashe. Często używam wzoru „nameHASH”. Nie używaj „name-hash” lub jego odmian, prosty podział ujawniłby prawdziwą nazwę pola. Teraz, bot nie może rozpoznać co to za pola, po prostu wie, że formularz ma jakieś pola, które muszą być wypełnione, być może podążając za „typem” jako wzorcem.

  3. Tworząc pola „h o n e y p o t” będziemy w stanie zidentyfikować Spamera. Ważne, aby: Niech etykieta będzie pusta, użyj swojej klasy „ohnohoney”, aby ukryć wszystkie te fałszywe wejścia. Zmień swoje fałszywe dane wejściowe na najbardziej proste, ogólne i atrakcyjne jak to tylko możliwe. Użyj prostych i powszechnych nazw jak „email, telefon, imię, etc”, wyłącz autocomplete (więc przeglądarka nie wypełni go), wyłącz reguły, ale zachowaj typy.

Teraz mamy 2 części w naszym formularzu: Prawdziwe pola z naszymi danymi wejściowymi chronionymi przez hashe i dziwne nazwy (możesz zaimplementować hash lub dziwne nazwy, jak wolisz). Oraz nasz honeypot (nie pisz „honeypot”, wolę rozdzielić litery, aby uniknąć rozpoznania). Teraz na swoim backendzie:

  1. Sprawdź, czy któreś z pól „h o n e y p o t” zostało wypełnione. Jeśli tak, gratulacje, złapałeś spam. Większość z nich wypełni wszystkie te pola bez ich odróżniania. Więc wszystko, co musisz zrobić, to sprawdzić, czy którykolwiek z „h o n e y p o t” pola przyszedł wypełniony, jeśli tak, to spam. Jeśli wolisz, możesz wykonać to sprawdzenie na kliencie, w przypadku formularza ajaxowego, pozwoli to uniknąć wykorzystania zasobów serwera do obliczania niepotrzebnych danych (ale i tak zachowaj walidację backendu). Kiedy złapiesz spam, po prostu nie wysyłaj danych i zrób z nimi co chcesz. Jeśli nazwy takie jak „email, telefon, itp” są ważne dla twojego backendu, po prostu przepisz nazwy używając tablic.

Tutaj jest jednoplikowe repo z prostą implementacją tej techniki:
https://github.com/felippe-regazio/php-honeypot-example

Pamiętaj: to jest tylko prosta warstwa do zapobiegania atakom w prosty sposób, niektóre technologie mogą zidentyfikować nawet te wzorce, więc użyj całej broni jaką możesz przeciwko nim. Wierzę jednak, że ten prosty wzór może zapobiec co najmniej 50% spamu na twojej stronie.