Honeypot – czyli złap bota na plaster miodu

Honey­pot w kontek­ście webde­ve­lo­pe­ra odnosi się do techni­ki stoso­wa­nej w celu łapania i identy­fi­ka­cji automa­tycz­nych botów lub niechcia­nych użytkow­ni­ków na stronach internetowych.

Idea honey­po­tu polega na umiesz­cze­niu ukrytych pól formu­la­rza, które są widocz­ne tylko dla botów, a niewi­docz­ne dla prawdzi­wych użytkow­ni­ków. Jeśli pole to zosta­nie wypeł­nio­ne, oznacza to, że formu­larz został wysła­ny przez bota, a nie przez człowie­ka. Może to sugero­wać próbę spamo­wa­nia lub ataku na stronę internetową.

Przykład użycia honey­po­tu w formu­la­rzu 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ła­dzie ukryte pole <input type="text" name="honeypot"> jest dodawa­ne do formu­la­rza, ale jest styli­zo­wa­ne za pomocą display: none;, co oznacza, że nie jest widocz­ne dla użytkow­ni­ków. Jeśli bot automa­tycz­nie wypeł­ni to pole, można to wykryć po stronie serwe­ra i podjąć odpowied­nie działa­nia, na przykład odrzu­cić takie żądanie.

Warto jednak pamię­tać, że honey­pot nie jest skutecz­nym rozwią­za­niem w 100%. Zaawan­so­wa­ne boty mogą próbo­wać anali­zo­wać struk­tu­rę strony, aby omijać honey­po­ty. Dlate­go warto stoso­wać również inne metody, takie jak CAPTCHA lub anali­za zacho­wań użytkow­ni­ków, aby lepiej chronić swoją stronę przed niechcia­ny­mi działaniami.

Wykrywanie bota w ContactForm7

Aby wykryć bota potrzeb­ne jest ukryte pole i filtr, który przeana­li­zu­je wpis zanim system go obsłu­ży. W tym celu możemy stworzyć prostą wtycz­kę 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 wszyst­kim korzy­sta­my z filtra o nazwie 'wpcf7_​skip_​mail'. Podpi­na­my naszą funkcję 'wdax_​skip_​mail' i jeżeli zwróci ona wartość false, to system obsłu­ży wpis do formu­la­rza – czyli najczę­ściej wyśle mejla, doda wpis do Flamin­go (o ile jest zainsta­lo­wa­ny). Wystar­czy jednak, że coś zmieni tę wartość na true i nic się dalej nie wydarzy.

Nic się nie wydarzy, ale chcemy wiedzieć, przynaj­mniej ja jestem ciekaw, że coś się jednak stało. Że przyszedł miś i zjadł miód. Dlate­go dodałem plik z logami. Zapisu­je­my go w katalo­gu log, a jeżeli jeszcze nie istnie­je, to zakła­da­my taki (linie od 7 do 11). Jeżeli filtr coś wykry­je, to dopisu­je­my do pliku my_skip_mail.txt datę. Możemy też dodać adres IP lub inną potrzeb­ną infor­ma­cję. Adres IP może pomóc w zablo­ko­wa­niu bota na zawsze.

Ukryte pole w ContactForm7 w tym przypad­ku ma id: your-surna­me. Boty nie są głupie, należy do nich podcho­dzić z szacun­kiem i nie nazywać pól byle jak. Nazwi­sko na pewno bardziej go skusi niż diejiej-fejif. Użyty filtr spraw­dzi czy pole istnie­je 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świe­tlo­ne w oknie przeglą­dar­ki, ale anali­zu­je kod. Jeżeli widzi pole your-name, potem your-surna­me, to wpisze coś tu i tu. (Może warto do loga wpisać jak ma dziad na nazwisko?).

Mając pewność że to bot dodaje­my filtr bloku­ją­cy akcję Flamin­go: 'wpcf7_​flamingo_​submit_​if' i ustawia­my wynik na true. Na tym się kończy. Zaosz­czę­dzi­li­śmy zasoby serwe­ra, ale bot będzie wracał i kombi­no­wał. Dlate­go pomyśl nad zbiera­niem adresów IP i albo w .htaccess albo w konfi­gu­ra­cji serwe­ra odetnij dostęp.

Dodaj komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.