Spam z formularza kontaktowego PrestaShop: dlaczego antyspam oparty na zabronionych słowach nie działa
Dwa sposoby na stratę czasu, a drugi jest gorszy
Do skrzynki, która odbiera wiadomości z formularza kontaktowego, trafiają dwie rzeczy: zapytania klientów i niezamówione propozycje, czyli pozycjonowanie, netlinking, programiści płatni od godziny, zaproszenia do inwestowania w kryptowaluty i od czasu do czasu próba wyłudzenia danych logowania do panelu administracyjnego.
Pierwszy sposób na stratę czasu to czytanie wszystkiego. Drugi, gorszy, to przestać czytać: gdy prawie wszystko jest śmieciem, właściwa wiadomość jest oglądana już tylko mimochodem. Utracony kontakt nie zostawia błędu w logach, zostawia klienta, który odchodzi, nie mówiąc dlaczego.
Dlaczego lista zabronionych słów nie działa
Najpopularniejsza obrona to lista słów: jeśli wiadomość zawiera „SEO”, „darmowa”, „oferta”, zostaje odrzucona. Działa to przez tydzień, a potem przychodzi rachunek, ponieważ słowa pojawiające się w spamie są tymi samymi, których używają klienci. „Widziałem, że mają Państwo promocję na zestaw wkrętaków. Czy dostawa jest darmowa powyżej 49 euro także na wyspy?”, to klient tuż przed zakupem.
Wada nie leży w liście, lecz w metodzie: słowo nie niesie ze sobą intencji osoby, która je napisała. Dotyczy to także drugiej strony, ponieważ dobrze napisany spam nie zawiera żadnego podejrzanego słowa. Zwiększając rygor, blokuje się więcej prawdziwych klientów; zmniejszając go, przepuszcza się więcej spamu: żadne ustawienie nie rozwiązuje problemu, ponieważ to nie jest właściwy sygnał.

Dlaczego captcha nie wystarcza
Captcha rozwiązuje inny problem i robi to dobrze: uniemożliwia programowi wypełnienie formularza tysiące razy. Nie uniemożliwia jednak osobie wysłania oferty handlowej ani programowi, który potrafi je rozwiązać, zrobienia tego samego. Captcha, honeypot i limit wysyłek na adres IP sprawdzają, jak wiadomość dotarła; tutaj problemem jest to, co w niej napisano.

Model, który podejmuje decyzję zamiast pisać
Modną odpowiedzią na pytanie „czy ta wiadomość to spam?” jest zapytanie modelu językowego: pisze się prompt i ma nadzieję, że zwrócony tekst da się zinterpretować. Działa to do dnia, w którym model odpowiada „Powiedziałbym, że tak, choć to zależy”, a kod, który czekał na TAK albo NIE, decyduje losowo.
Istnieje typ modelu pomyślany na przypadek odwrotny: nie generuje tekstu, odpowiada na pytania z określonym typem odpowiedzi. Dla każdego zwraca liczbę: przy pytaniu tak/nie prawdopodobieństwo, że odpowiedź brzmi tak; przy pytaniu wielokrotnego wyboru wybraną opcję, prawdopodobieństwo każdej z nich i wskaźnik pewności, czyli to, jak wyraźny jest ten wybór w porównaniu z pozostałymi. Funkcja Antispam Jev naszego modułu formularzy kontaktowych jest zbudowana na jednym z takich modeli, Jev firmy TypeSafe AI.
Praktyczna różnica polega na tym, że decyzja zostaje w kodzie: model mówi, jak bardzo jest pewny, a to, co się z tym zrobi, rozstrzyga próg, który sprzedawca może zmienić. Dla każdej wiadomości w jednym wywołaniu wysyłanych jest sześć pytań, ocenianych równolegle: czy to niezamówiona reklama, czy zawiera podejrzane linki, czy to phishing, czy to szablon wysyłany masowo, który dział powinien odpowiedzieć, czy sprawa jest pilna.

Najważniejszy jest trzeci stan. Powyżej progu górnego podejmuje się działanie i wiadomość trafia do kolejki wiadomości podejrzanych; poniżej nie robi się nic, wiadomość przechodzi, a ocena zostaje w rejestrze; pomiędzy, tam gdzie model się waha, potrzebne jest potwierdzenie drugiego sygnału. „Nie wiem” jest użyteczną odpowiedzią, jeśli kod jest napisany tak, aby jej słuchać.

Co zmierzyliśmy
Te liczby pochodzą z testu, który przeprowadziliśmy na instalacji deweloperskiej PrestaShop 9, a nie z niezależnego badania: dziesięć wiadomości napisanych przez nas po włosku, sześć prawidłowych i cztery niechciane.
Sześć prawidłowych wiadomości wybrano tak, aby były trudne: rozgniewany klient, który żąda zwrotu pieniędzy i grozi zakwestionowaniem płatności w swoim banku, wiadomość napisana w całości wielkimi literami, wiadomość z linkiem do strony firmy nadawcy, bardzo długa i niejasna, dwuwyrazowa po włosku („Wysyłacie na Sycylię?”) oraz ta pełna słów „darmowa”, „oferta” i „promocja”. Wszystkie sześć przeszło, a prawdopodobieństwo niezamówionej reklamy pozostało na poziomie 2% lub niższym. Cztery niechciane (propozycja SEO, phishing ze skróconym linkiem, zaproszenie do inwestowania, ogólny szablon wysyłany masowo) trafiły wszystkie do kolejki podejrzanych, z wynikiem od 98% do 99%.
Dziesięć wywołań zajęło od 535 do 663 milisekund, średnio 596 ms, przy zużyciu około 900 do 1 240 tokenów na wiadomość. Przy wyłączonej funkcji ta sama wysyłka zajęła 95 ms: dodatkowe pół sekundy to cena oceny, a płaci się ją tylko wtedy, gdy funkcja jest włączona.
Najbardziej interesował nas inny test: skierowaliśmy moduł na adres, który nie odpowiada. Po 4 057 milisekundach, czyli po skonfigurowanym czasie oczekiwania, wiadomość została dostarczona normalnie, a błąd zapisano w rejestrze. Tak samo przy braku klucza API i przy kluczu błędnym.

Czego celowo nie robi
Niczego nie usuwa. Rozpoznany spam trafia do kolejki, którą sprzedawca otwiera, czyta i z której może odzyskać wiadomość jednym kliknięciem, po czym wysyłane jest zatrzymane wcześniej powiadomienie. Odwiedzający i tak widzi ekran potwierdzenia: osobie wysyłającej spam nie tłumaczy się, jak została odfiltrowana, a klient, który znalazłby się tam przez pomyłkę, nie zostaje odrzucony.
Nie narusza decyzji sprzedawcy: kierowanie wybiera spośród działów faktycznie skonfigurowanych w module i interweniuje tylko tam, gdzie wcześniej zostałby użyty adres ogólny. Poniżej progu pewności pozostaje odbiorca domyślny.
Ograniczenia, powiedziane z góry
Treść wiadomości jest wysyłana do zewnętrznego dostawcy w Stanach Zjednoczonych: jest to przekazanie danych osobowych poza Unię Europejską, które musi zostać ujęte w polityce prywatności sklepu. Dlatego funkcja jest domyślnie wyłączona, panel wprost wskazuje, co wychodzi i do kogo, wysyłanie adresu e-mail nadawcy jest wyłączone, chyba że zostanie wyraźnie wybrane, a moduł dostarcza gotowe zdanie do wklejenia w politykę prywatności w pięciu językach: tekst do dostosowania i sprawdzenia, a nie opinia prawna.
Usługa jest nowa i rozliczana według zużycia: gdy kredyt się wyczerpie, przestaje odpowiadać, a wiadomości przechodzą tak jak przy każdym innym błędzie. A dziesięć wiadomości mówi, że przy tych dziesięciu filtr się nie pomylił, a nie że nigdy się nie pomyli: dlatego istnieje kolejka i dlatego każda ocena jest zapisywana wraz z prawdopodobieństwem, pewnością, czasem i tokenami.
Gdzie ją znaleźć
Antispam Jev to funkcja naszego modułu formularzy kontaktowych dla PrestaShop, a nie osobny moduł: ci, którzy już go używają, znajdą ją w konfiguracji, wyłączoną. Jeśli problem, który Państwo rozpoznają, to ten drugi z tego artykułu, czyli prawdziwa wiadomość gubiąca się wśród pozostałych, to właśnie do niego została stworzona.


