Honeypot w kontekście webdevelopera odnosi się do techniki stosowanej w celu łapania i identyfikacji automatycznych botów lub niechcianych użytkowników na stronach internetowych.
Idea honeypotu polega na umieszczeniu ukrytych pól formularza, które są widoczne tylko dla botów, a niewidoczne dla prawdziwych użytkowników. Jeśli pole to zostanie wypełnione, oznacza to, że formularz został wysłany przez bota, a nie przez człowieka. Może to sugerować próbę spamowania lub ataku na stronę internetową.
Przykład użycia honeypotu w formularzu HTML:
<form action="submit.php" method="POST"> <input type="text" name="name" placeholder="Your Name" required> <input type="email" name="email" placeholder="Your Email" required> <div style="display: none;"> <label>Leave this field blank:</label> <input type="text" name="honeypot"> </div> <button type="submit">Submit</button> </form>
W powyższym przykładzie ukryte pole <input type="text" name="honeypot"> jest dodawane do formularza, ale jest stylizowane za pomocą display: none;, co oznacza, że nie jest widoczne dla użytkowników. Jeśli bot automatycznie wypełni to pole, można to wykryć po stronie serwera i podjąć odpowiednie działania, na przykład odrzucić takie żądanie.
Warto jednak pamiętać, że honeypot nie jest skutecznym rozwiązaniem w 100%. Zaawansowane boty mogą próbować analizować strukturę strony, aby omijać honeypoty. Dlatego warto stosować również inne metody, takie jak CAPTCHA lub analiza zachowań użytkowników, aby lepiej chronić swoją stronę przed niechcianymi działaniami.
Wykrywanie bota w ContactForm7
Aby wykryć bota potrzebne jest ukryte pole i filtr, który przeanalizuje wpis zanim system go obsłuży. W tym celu możemy stworzyć prostą wtyczkę o takim kodzie:
/** * Plugin Name: Contact Form 7 Honey Pot */ if (!function_exists('wdax_skip_mail')) { function wdax_skip_mail($f) { $log = (ABSPATH . '/log/my_skip_mail.txt'); if (!is_dir(ABSPATH . '/log')) { @mkdir(ABSPATH . '/log'); } if (isset($_POST["your-surname"]) && strlen($_POST["your-surname"])) { if (is_dir(ABSPATH . '/log')) { $handle = fopen($log, "a+"); if (fwrite($handle, date("YmdHis") . "\n") === FALSE) { echo "Cannot write to file ($log)"; exit; } fclose($handle); } add_filter('wpcf7_flamingo_submit_if', '__return_empty_array'); // DO NOT STORE IN FLAMING return true; // DO NOT SEND E-MAIL } return false; } add_filter('wpcf7_skip_mail', 'wdax_skip_mail'); }
Przede wszystkim korzystamy z filtra o nazwie 'wpcf7_skip_mail'. Podpinamy naszą funkcję 'wdax_skip_mail' i jeżeli zwróci ona wartość false, to system obsłuży wpis do formularza – czyli najczęściej wyśle mejla, doda wpis do Flamingo (o ile jest zainstalowany). Wystarczy jednak, że coś zmieni tę wartość na true i nic się dalej nie wydarzy.
Nic się nie wydarzy, ale chcemy wiedzieć, przynajmniej ja jestem ciekaw, że coś się jednak stało. Że przyszedł miś i zjadł miód. Dlatego dodałem plik z logami. Zapisujemy go w katalogu log, a jeżeli jeszcze nie istnieje, to zakładamy taki (linie od 7 do 11). Jeżeli filtr coś wykryje, to dopisujemy do pliku my_skip_mail.txt datę. Możemy też dodać adres IP lub inną potrzebną informację. Adres IP może pomóc w zablokowaniu bota na zawsze.
Ukryte pole w ContactForm7 w tym przypadku ma id: your-surname. Boty nie są głupie, należy do nich podchodzić z szacunkiem i nie nazywać pól byle jak. Nazwisko na pewno bardziej go skusi niż diejiej-fejif. Użyty filtr sprawdzi czy pole istnieje i czy długość wpisu jest większa niż 0. Człowiek tego pola nie widzi i musiałby się uprzeć by coś tam wpisać. Bot jest ślepy na to co jest wyświetlone w oknie przeglądarki, ale analizuje kod. Jeżeli widzi pole your-name, potem your-surname, to wpisze coś tu i tu. (Może warto do loga wpisać jak ma dziad na nazwisko?).
Mając pewność że to bot dodajemy filtr blokujący akcję Flamingo: 'wpcf7_flamingo_submit_if' i ustawiamy wynik na true. Na tym się kończy. Zaoszczędziliśmy zasoby serwera, ale bot będzie wracał i kombinował. Dlatego pomyśl nad zbieraniem adresów IP i albo w .htaccess albo w konfiguracji serwera odetnij dostęp.