Ochrona formularzy przed spamem bez CAPTCHA: walidacja po stronie serwera i filtr antyspamowy
Jak zabezpieczyłem formularze kontaktowe przed spamem bez CAPTCHA: wielowarstwowa walidacja po stronie serwera, honeypot, kontrola czasu, weryfikacja źródła i limity wysyłek — bez pogorszenia UX.
Klient
Branża
Usługi
Strona internetowa

Problem
Spam w formularzach kontaktowych i ryzyko dla CRM oraz poczty
Po skutecznej optymalizacji SEO i wzroście ruchu organicznego serwis zaczął stabilnie pozyskiwać ponad 600 użytkowników miesięcznie. Razem z ruchem wzrosła liczba zapytań — dokładnie tego oczekiwał biznes.
Równolegle pojawił się jednak problem, który często idzie w parze z widocznością w Google: spam w formularzach. Boty zaczęły masowo „testować” publicznie dostępne pola, wysyłając zgłoszenia:
- z przypadkowymi imionami i nazwiskami,
- z nieistniejącymi adresami e-mail,
- z bardzo krótkimi / losowymi numerami telefonu,
- z szablonowymi treściami bez związku z ofertą.
Z czasem przestało to być tylko „irytujące” — pojawiły się realne ryzyka biznesowe:
- zaśmiecanie CRM i spadek jakości danych,
- strata czasu zespołu na obsługę fałszywych leadów,
- zaburzenie analityki (fałszywa konwersja, złe wnioski),
- ryzyko reputacyjne poczty: automatyczne odpowiedzi i powiadomienia wysyłane
- na nieprawdziwe adresy zwiększają szanse na problemy ze spamem.
Kluczowe było to, że część spamu nie przechodziła przez „interfejs” strony, tylko trafiała bezpośrednio na endpoint API. Czyli sama walidacja w formularzu nie wystarczała.
CAPTCHA była rozważana, ale jako ostateczność: potrafi obniżyć konwersję i psuje doświadczenie użytkownika, a w projektach międzynarodowych jest szczególnie uciążliwa. Dlatego celem było rozwiązanie „niewidzialne”, ale skuteczne.
Zadanie
Ochrona formularza przed spamem bez CAPTCHA i bez spadku konwersji
Głównym celem było wdrożenie ochrony formularzy przed spamem bez CAPTCHA, tak aby realny użytkownik nie zauważył żadnej „walki z botami”, a biznes od razu odczuł poprawę jakości leadów.
Od strony biznesowej cele były konkretne:
- zatrzymać spam wysyłany bezpośrednio na API,
- chronić CRM i skrzynki mailowe przed śmieciowymi zgłoszeniami,
- odciążyć zespół i wyeliminować ręczne filtrowanie,
- ograniczyć ryzyko problemów z dostarczalnością e-maili (reputacja domeny),
- utrzymać (a najlepiej poprawić) konwersję formularzy.
Od strony UX i produktu:
- formularze mają pozostać szybkie i proste,
- żadnych dodatkowych kroków typu CAPTCHA, quizy czy podejrzane checkboksy,
- poprawne działanie autouzupełniania w przeglądarkach i na telefonach,
- spójne działanie dla użytkowników z różnych krajów.
Od strony technicznej:
- rozwiązanie niezależne od płatnych usług,
- skalowalne razem z ruchem,
- wielowarstwowe (nie jeden „magiczny” warunek),
- oparte o kontekst żądania (źródło, nagłówki, zachowanie),
- do ponownego użycia we wszystkich formularzach.
W praktyce oznaczało to jedno: walidacja po stronie serwera miała być „bramką”, której bot nie obejdzie prostym POST-em. Weryfikacja Origin/Referer jako warstwa ochrony jest często wskazywana jako element wzmacniający bezpieczeństwo.
Wyniki
Mniej spamu w CRM i czystsze leady bez pogorszenia UX
Efekty były zauważalne krótko po wdrożeniu i potwierdzone w kolejnych tygodniach stabilnej pracy.
Najważniejsze rezultaty biznesowe:
- spam został ograniczony praktycznie do zera (w praktyce ~98% mniej),
- do CRM i na e-mail trafiają głównie realne zapytania,
- zespół przestał marnować czas na „śmieciowe” zgłoszenia,
- niższe ryzyko problemów po stronie poczty (mniej wysyłek na nieistniejące adresy).
Z perspektywy użytkownika:
- brak CAPTCHA i dodatkowych barier,
- brak spadku konwersji,
- poprawne działanie autouzupełniania i wysyłki formularza.
Z perspektywy utrzymania:
- jedno podejście dla wielu formularzy,
- logika po stronie serwera trudna do obejścia,
- brak kosztów licencji / abonamentów.
Wykonana praca
1. Analiza źródeł spamu i wzorców ataku
Na starcie przeanalizowałem zgłoszenia oraz wzorce wysyłki. To pozwoliło potwierdzić, że spam przychodzi:
- bez realnego kontekstu strony,
- z nietypowymi nagłówkami,
- z nienaturalnym czasem „wypełnienia”,
- często seriami (z jednego źródła/IP lub powtarzalnych danych).
2. Wielowarstwowy filtr antyspamowy bez CAPTCHA
Zamiast jednego mechanizmu wdrożyłem zestaw niezależnych kontroli, które razem budują skuteczną barierę:
- honeypot (ukryte pole) — niewidoczne dla człowieka, często wypełniane przez boty, więc łatwo odfiltrowuje automaty.
- kontrola czasu wysyłki — zbyt szybkie wysłanie wygląda jak automat,
weryfikacja Origin/Referer — żądanie ma wyglądać jak wysłane z realnej strony, nie „z powietrza”. - walidacja adresu strony (currentPage) — dodatkowa kontrola kontekstu,
ograniczanie liczby zgłoszeń (rate limiting) po IP i po e-mailu, - walidacja danych (e-mail/telefon/imię) + proste heurystyki na „tokeny” i losowe stringi.
3. Ujednolicenie logiki dla wielu formularzy
Ta sama polityka ochrony działa dla:
- formularza standardowego,
- formularza pełnego,
- formularza minimalnego,
- formularza partnerskiego.
To upraszcza utrzymanie: jedna logika po stronie serwera, spójne zasady i jedno miejsce do rozwoju.
Najważniejsze elementy projektu
Opis projektu
Wielopoziomowa ochrona zamiast CAPTCHA
Wiele stron rozwiązuje problem spamu poprzez wdrożenie CAPTCHA. Jest to rozwiązanie proste, ale obarczone kosztami:
- pogarsza doświadczenie użytkownika,
- obniża konwersję,
- działa gorzej na urządzeniach mobilnych,
- nie pasuje do projektów z segmentu premium.
W tym projekcie zastosowano inne podejście — logikę antyspamową opartą na danych i zachowaniu użytkownika, działającą w tle.
Dla użytkownika formularz pozostaje prosty i szybki, a system samodzielnie rozpoznaje, czy zgłoszenie pochodzi od człowieka czy od automatu.
Ochrona API i danych biznesowych
Kluczowe było zabezpieczenie nie tylko samego formularza, ale również endpointu serwera przyjmującego dane.
Nawet jeśli ktoś pozna adres API, nie jest w stanie wysłać skutecznego zgłoszenia bez spełnienia wszystkich warunków weryfikacji.
Chroni to:
- CRM przed zaśmieceniem danymi,
- skrzynki e-mail przed spamem,
- procesy biznesowe przed zniekształconą analityką.
Dlaczego to ma znaczenie dla biznesu
Czyste i wiarygodne zgłoszenia oznaczają:
- rzetelną analitykę,
- lepsze decyzje marketingowe,
- oszczędność czasu zespołu,
- zaufanie do danych,
- stabilne działanie strony jako narzędzia sprzedaży.
Strona internetowa to nie tylko design i treści — to system generowania leadów, który musi być bezpieczny i przewidywalny.
Gdzie takie rozwiązanie jest szczególnie potrzebne
Takie podejście sprawdza się zwłaszcza w projektach:
- stron usługowych i agencji,
- nieruchomości i inwestycji,
- B2B,
- serwisów międzynarodowych,
- projektów z ruchem płatnym,
- stron bez wydzielonego call center.
Podsumowanie
Ten case pokazuje, jak techniczne decyzje bezpośrednio wpływają na wynik biznesowy.
Bez komplikowania formularzy, bez płatnych narzędzi, bez CAPTCHA — tylko dobrze zaprojektowana logika, która chroni dane i utrzymuje wysoką jakość leadów.
Użyte technologie
Integracja API
TypeScript
Next.js







