# Masz dość spamu z formularza? Tak zablokowaliśmy 9 070 zgłoszeń od botów

> Przez 16 dni nasz formularz kontaktowy przyjął 9 070 zgłoszeń od jednego bota, w szczycie 1 091 na dobę. Pokazujemy, dlaczego ukryte pole i limit IP go nie zatrzymały i co działa zamiast captchy.

Opublikowano: 2026-08-28 · Aktualizacja: 2026-09-16
Źródło: https://kompasfirm.pl/blog/spam-z-formularza-kontaktowego-jak-zablokowac-boty

---
Przez szesnaście dni sierpnia nasz własny formularz kontaktowy przyjął **9 070 zgłoszeń od botów**. Wszystkie od tego samego automatu, w szczytowym dniu 1 091 wiadomości na dobę. Znasz to uczucie, jeśli kiedykolwiek prowadziłeś stronę na WordPressie: skrzynka firmowa zamienia się w śmietnik, a prawdziwe zapytanie od klienta ginie gdzieś między setką „Hi, I wanted to know your price". W tym wpisie pokazujemy, jak ten bot działał, dlaczego klasyczne zabezpieczenia go nie zatrzymały, co zrobiliśmy, żeby na stronach z KOMPASFIRM ten problem po prostu nie istniał, i co widzisz w panelu, gdy ochrona działa.

[[cta:start]]

## Jak wygląda spam z formularza kontaktowego

Bot wypełnia Twój formularz tak samo jak człowiek, tylko tysiąc razy dziennie. Nasz podpisywał się zawsze tym samym nazwiskiem, podawał losowy adres jednorazowy i numer telefonu, a w treści zostawiał jedno zdanie: „Cześć, chciałem poznać Waszą cenę", przepuszczone przez tłumacza na przypadkowy język. W próbkach trafiliśmy na gruziński i islandzki.

To nie jest atak wymierzony w konkretną firmę. To masowa kampania, która skanuje internet w poszukiwaniu formularzy i wysyła w nie miliony zgłoszeń, licząc na to, że ktoś odpisze. Twoja strona nie musi być popularna, żeby ją znaleźli. Wystarczy, że ma formularz. Po co to komuś? Trzy typowe motywy: wyłudzenie odpowiedzi, która potwierdza, że adres jest żywy (do dalszych wysyłek), podrzucenie linku do oszustwa albo „oferty pozycjonowania" i testowanie, czy formularz da się wykorzystać do wysyłania maili w cudzym imieniu.

Praktyczne skutki są trzy i każdy kosztuje:

- **Prawdziwe zapytania giną.** Przy tysiącu wiadomości dziennie nikt nie przegląda skrzynki uważnie. Lead od klienta wygląda jak kolejny spam i ląduje w koszu.
- **Twoja domena traci reputację.** Jeśli formularz wysyła powiadomienia na Twój adres, a Ty masowo je kasujesz albo oznaczasz jako spam, dostawcy poczty uczą się, że Twoje wiadomości są niechciane. Potem Twoja oferta handlowa trafia klientowi do spamu.
- **Płacisz za śmieci.** Każde zgłoszenie to wpis w bazie, wysłany mail i miejsce w skrzynce.

## Dlaczego ukryte pole nie wystarcza

Najpopularniejsze zabezpieczenie formularzy to tak zwany honeypot, czyli ukryte pole. Człowiek go nie widzi i nie wypełnia, a prymitywny bot wypełnia wszystko, co znajdzie w formularzu. Jeśli pole nie jest puste, zgłoszenie leci do kosza.

Ta metoda działa, ale tylko na najprostsze automaty. Nasz bot był mądrzejszy: parsował formularz, rozpoznawał, które pola są widoczne dla użytkownika, i wypełniał wyłącznie te. Ukryta pułapka zostawała pusta, więc zgłoszenie przechodziło jako czyste. Mieliśmy honeypot od początku i przez szesnaście dni nie zatrzymał ani jednego z tych 9 070 zgłoszeń.

Drugie klasyczne zabezpieczenie to limit liczby zgłoszeń z jednego adresu IP. Też mieliśmy, też nie pomógł. Limit liczony jest w zgłoszeniach na minutę, a bot wysyłał około czterdziestu na godzinę, więc nigdy nawet nie zbliżył się do progu. Zaostrzenie limitu nie jest wyjściem: firmy i osiedla często wychodzą do internetu z jednego adresu, więc ostry limit blokowałby prawdziwych klientów.

Zostaje captcha, czyli te obrazki z przejściami dla pieszych. Skuteczna, ale płacisz za nią konwersją: każdy dodatkowy klik między klientem a wysłaniem zapytania to część osób, które rezygnują. Nie chcieliśmy tego na stronach naszych klientów.

![Formularz kontaktowy na stronie klienta: cztery pola i przycisk, bez captchy i bez dodatkowego kliknięcia](/img/blog/antyspam/01-formularz-na-stronie.jpg)

## Cztery warstwy zamiast jednej

Rozwiązanie, które wdrożyliśmy, opiera się na prostej obserwacji: bot nie zachowuje się jak człowiek, nawet jeśli wypełnia te same pola. Zamiast jednego zabezpieczenia strona sprawdza teraz cztery rzeczy naraz.

**Ukryte pole** zostaje, bo kosztuje zero i nadal wyłapuje najprostsze automaty.

**Podpisany znacznik czasu.** Formularz niesie ukryty token wygenerowany przez serwer w momencie, gdy strona się wyświetla. Token jest podpisany kryptograficznie, więc nie da się go podrobić bez znajomości klucza. Niesie w sobie informację, kiedy dokładnie strona została pokazana. Bot, który odtwarza wysyłkę na podstawie zrzutu formularza sprzed tygodni, nie ma tokenu w ogóle.

**Próg czasu.** Człowiek musi przeczytać formularz, kliknąć w pola i coś napisać. To nigdy nie trwa krócej niż kilka sekund. Zgłoszenie wysłane szybciej, niż człowiek zdążyłby ten formularz przeczytać, pochodzi od automatu. Konkretnego progu nie podajemy publicznie.

**Czwarta warstwa** sprawdza cechy zgłoszenia, które w kontekście językowym naszych stron nie mają prawa wystąpić. Akurat jej nie opisujemy, bo jej skuteczność zależy od tego, że nie jest opisana.

Żadna z tych warstw nie wymaga od klienta jednego dodatkowego kliknięcia. Formularz wygląda i działa tak samo jak wcześniej.

[[cta:mid]]

## Co pokazały pierwsze godziny po wdrożeniu

Najciekawsze wyszło dopiero na danych. Spodziewaliśmy się, że bota zatrzyma brak tokenu, czyli że odtwarza on stare zgłoszenia. Rzeczywistość okazała się inna.

W ciągu pierwszych pięciu godzin system zablokował 67 prób, a rozkład powodów zaskoczył: **ani jedna nie miała brakującego ani podrobionego tokenu**. To znaczy, że bot za każdym razem pobiera stronę na świeżo i dostaje poprawny, prawidłowo podpisany token. Zatrzymuje go dopiero to, jak się potem na tej stronie zachowuje.

Gdybyśmy postawili tylko na podpisany token, ten konkretny automat przeszedłby dalej. Zadziałało to, że warstwy są cztery i sprawdzają różne rzeczy.

Wynik po stronie skrzynki jest jednoznaczny. Ostatni spamowy mail dotarł osiem minut przed wdrożeniem. Od tego momentu: **zero**. Dla porównania w dobie poprzedzającej zmianę było ich 1 091.

## To działa na każdym formularzu, nie tylko na kontaktowym

Tu jest różnica względem podejścia wtyczkowego, które znasz z WordPressa. Tam instalujesz wtyczkę antyspamową, konfigurujesz ją, a potem okazuje się, że chroni formularz kontaktowy, ale już nie ten w stopce, nie zapytanie o produkt w sklepie i nie formularz na landingu, bo tamte pochodzą z innej wtyczki.

W KOMPASFIRM ochrona jest częścią silnika, nie dodatkiem. Obejmuje wszystkie miejsca, w których ktokolwiek może coś wysłać:

- formularze kontaktowe na wszystkich typach stron (wizytówka, katalog, strona B2B), także warianty z załącznikami,
- formularze na landingach sprzedażowych, łącznie z popupami i formularzami dwuetapowymi,
- zapytania o produkt i zamówienia w mini-sklepie,
- kalkulatory wycen, które zbierają dane kontaktowe,
- wyszukiwarkę na stronie (żeby boty nie zaśmiecały monitoringu fraz),
- kreator stron dostępny bez rejestracji.

![Lista formularzy strony w panelu: każdy z własnym identyfikatorem i licznikiem zapytań](/img/blog/antyspam/03-lista-formularzy.jpg)

Nie musisz niczego włączać, konfigurować ani aktualizować. Nie ma wtyczki, która przestanie być rozwijana. Nie ma abonamentu za filtr antyspamowy. Działa w każdym planie, także w darmowym.

![Edytor formularza: pola, ich typy, oznaczenie wymagalności i adresy powiadomień](/img/blog/antyspam/02-edytor-formularza.jpg)

## Co widzisz Ty, a czego nie widzi bot

Zaprojektowaliśmy to tak, żeby bot nie dowiedział się, że został zatrzymany. Kiedy zgłoszenie wpada w pułapkę, dostaje zwyczajną odpowiedź „dziękujemy, wysłano". Nic się nie zapisuje w skrzynce leadów i nic nie leci na Twoją pocztę, ale automat nie ma sygnału, że warto zmienić metodę.

Zablokowane próby są natomiast liczone: w analityce strony widzisz, ile zgłoszeń zatrzymała ochrona i z jakiego powodu, więc masz dowód, że problem istniał i że jest pod kontrolą. To także odpowiedź na pytanie „dlaczego nie mam zapytań": jeśli zablokowanych prób są setki, a prawdziwych zgłoszeń zero, ruch na stronę jest botowy i problem leży w źródłach ruchu, nie w formularzu.

Jest jeden wyjątek i to on odróżnia dobrze zrobiony antyspam od takiego, który po cichu zjada klientów. Jeśli ktoś zostawi otwartą stronę na godzinę i dopiero potem wyśle formularz, jego token wygaśnie. To nie jest bot, tylko człowiek z nieaktualną kartą w przeglądarce. Taka osoba nie dostaje cichego „wysłano", tylko czytelny komunikat z prośbą o odświeżenie strony i ponowną wysyłkę. Ciche udawanie sukcesu w tym przypadku oznaczałoby utratę prawdziwego zapytania, a to gorsze niż sam spam.

## Co, gdy spam mimo to przejdzie

Żadna ochrona nie jest szczelna na zawsze, bo automaty się uczą. Dlatego w skrzynce leadów każde zgłoszenie można oznaczyć jako spam jednym kliknięciem: znika z listy zapytań, ale zostaje w historii, a statystyki uczą się, jak wygląda śmieciowe zgłoszenie na Twojej stronie. Jeśli zobaczysz falę spamu, która przechodzi, napisz do nas: warstwy są aktualizowane centralnie i poprawka trafia od razu na wszystkie strony, nie tylko na Twoją.

## Co robić, jeśli Twoja strona nie jest na KOMPASFIRM

Krótka lista dla stron na WordPressie i innych platformach, według skuteczności:

1. **Podpisany token z czasem wyświetlenia** (część wtyczek antyspamowych ma taką opcję pod nazwą „time check" albo „token"), bo eliminuje odtwarzanie wysyłek ze zrzutu.
2. **Honeypot** jako dodatek, nie jedyna warstwa.
3. **Limit z jednego adresu** ustawiony rozsądnie (kilka zgłoszeń na godzinę, nie jedno na dobę).
4. **Captcha tylko w ostateczności**, najlepiej w wersji niewidocznej, i tylko na formularzu, który jest atakowany, nie na wszystkich.
5. **Osobny adres na powiadomienia** z formularza, żeby fala spamu nie zniszczyła reputacji głównej skrzynki firmowej.

## Podsumowanie

Spam z formularzy to nie jest problem, który rozwiązuje się raz i na zawsze, bo automaty się uczą. Jest to natomiast problem, którego nie powinieneś rozwiązywać samodzielnie, instalując i konfigurując wtyczki.

Na stronach z KOMPASFIRM ochrona działa od pierwszego dnia, na każdym formularzu, bez captchy i bez ani jednego dodatkowego kliknięcia dla Twojego klienta. Liczby z naszego własnego wdrożenia: 9 070 zablokowanych zgłoszeń, które wcześniej trafiały do skrzynki, i zero spamowych maili od momentu uruchomienia.

[[cta:end]]
