Zpět na blog
Základy Publikováno 19.08.2026 7 min čtení

Co formulář skutečně chrání: CAPTCHA, honeypot, časová past, CSRF

Většina kontaktních formulářů spoléhá proti spamu na jediný trik a mnohé z těchto triků zastaví jen nejjednodušší boty. Co která ochranná vrstva zastaví, co stojí a jaká kombinace dává smysl.

Spam přes kontaktní formuláře jen zřídka pochází od člověka, který píše ručně. Většinou jde o software, který formuláře najde, vyplní všechna pole a výsledek odešle – tisíckrát. Existuje několik obran a působí ve velmi odlišných místech. Když víte, co která skutečně dělá, vyhnete se dvěma chybám: formuláři bez skutečné ochrany a formuláři střeženému tak přísně, že to skuteční lidé vzdají.

Srovnání ochranných vrstev
Vrstva a co zastaví
  • Honeypot: jednoduché boty, kteří vyplňují všechna pole
  • Časová past: skripty, které odesílají okamžitě po načtení
  • CAPTCHA: většinu obecné automatizace
  • Token CSRF: požadavky posílané přímo na endpoint
  • Omezení četnosti: záplavy z jednoho zdroje
  • Proof-of-work: levná hromadná odeslání, bez sledování a hádanek
  • Kontroly na straně serveru: vše, co obchází prohlížeč
Co přehlédne nebo co stojí
  • Cílení boti jej přeskočí; pokud je špatně skrytý, čtečky obrazovky jej oznámí
  • Boty, kteří počkají; bez podpisu na straně serveru ji lze snadno podvrhnout
  • Překážka pro všechny, bariéry v přístupnosti, často od třetí strany; existují služby, které ji řeší
  • Boti, kteří nejprve načtou stránku, dostanou platný token také
  • Spam rozložený mezi mnoho IP adres
  • Odhodlaného odesílatele s výpočetním výkonem; vyžaduje JavaScript
  • Samy o sobě nic – ale bez nich je každá další vrstva jen dekorace
Žádná jednotlivá vrstva nepokryje všechno. Levné, neviditelné vrstvy odfiltrují většinu; ty těžší jsou na vytrvalý, cílený spam.

Honeypot a časová past: neviditelné filtry

Honeypot je pole navíc, které lidé nikdy nevidí, například pole s názvem „website“ skryté pomocí CSS. Jednodušší boti vyplňují všechna pole, takže vyplněný honeypot signalizuje automatizaci a server může zprávu tiše zahodit. Boti napsaní přímo pro váš web nebo ti, kteří vykreslují stránku jako prohlížeč, jej přeskočí. Skryjte jej pořádně: pole pouze posunuté mimo obrazovku mohou čtečky obrazovky oznámit, lze se na něj dostat klávesou Tab nebo jej může vyplnit automatické doplňování. Použijte aria-hidden, tabindex -1 a autocomplete off a k tomu neutrální popisek, který každého, kdo se tam dostane, požádá, aby pole nechal prázdné.

Časová past zaznamená, kdy byl formulář doručen, a odmítne odeslání, která přijdou nepravděpodobně rychle. Lidé potřebují několik sekund na čtení a psaní; mnoho skriptů odesílá ve zlomku sekundy. Časové razítko musí být kontrolováno na serveru a chráněno proti manipulaci, například podepsané nebo uložené v relaci – obyčejné skryté pole s časem bot prostě přepíše. Hranici držte nízko, protože automatické doplňování zrychluje i skutečné lidi. Boti, kteří prostě počkají, projdou: časová past je filtr, ne zeď.

CAPTCHA: účinná, ale ne zadarmo

CAPTCHA požaduje důkaz, že nepracuje bot – od obrázkových hádanek po kontroly běžící na pozadí; mezi běžné služby patří reCAPTCHA, hCaptcha, Cloudflare Turnstile a Friendly Captcha. Zastaví většinu obecné automatizace, a proto je tak oblíbená. Každá viditelná hádanka je však překážkou, u které to někteří návštěvníci vzdají, a většina služeb načítá skript třetí strany, což vyvolává otázky ochrany soukromí a souhlasu. CAPTCHA navíc pomáhá jen tehdy, je-li správně nastavená: veřejný testovací klíč webu, widget bez skriptu nebo token, který server nikdy neověří, vypadá jako ochrana, ale ochranou není. Bezplatná kontrola na formexposed.com na takové chyby upozorní zvenčí.

Součástí této ceny je i přístupnost. Obrázkové hádanky vylučují nevidomé a mnoho slabozrakých lidí, zvukové alternativy nepomohou hluchoslepým a záludné logické úlohy zatěžují lidi s kognitivním postižením. Kritérium úspěšnosti 1.1.1 WCAG 2.2 vyžaduje textovou alternativu popisující účel CAPTCHA a alternativní formy pro různé smysly. Kontroly na pozadí se většině z toho vyhnou, ale když pojmou podezření, je záložním řešením často opět vizuální hádanka – tuto cestu otestujte s klávesnicí a čtečkou obrazovky.

Token CSRF: ochrana proti podvržení, ne proti spamu

Token CSRF je náhodná hodnota, kterou server vloží do formuláře a očekává ji zpět. Byl navržen proti cross-site request forgery, kdy jiný web přiměje prohlížeč návštěvníka odeslat požadavek, který návštěvník nikdy nezamýšlel. U veřejného kontaktního formuláře má vedlejší účinek: boti, kteří posílají data přímo na adresu formuláře bez načtení stránky, jsou odmítnuti. Každý bot, který stránku stáhne a token pošle zpět, projde. Většina frameworků a formulářových pluginů tokeny CSRF obsahuje tak jako tak – nechte je zapnuté, ale nepočítejte je jako ochranu proti spamu.

Co se musí stát na serveru

Kontroly pouze v prohlížeči nic nechrání
Vše, co běží pouze v prohlížeči – validace v JavaScriptu, skript kontrolující honeypot, token CAPTCHA, který nikdo neověřuje –, se přeskočí, jakmile někdo pošle požadavek přímo. Každé rozhodnutí o přijetí zprávy patří na server.
  • Validujte každé pole znovu na serveru: povinná pole, délku, formát e-mailu a žádná zalomení řádků v polích, která končí v hlavičkách e-mailu.
  • Ověřujte tokeny CAPTCHA a proof-of-work při každém odeslání, u vydávající služby nebo ve vlastním kódu, a odmítejte opakovaně použité tokeny.
  • Omezte počet odeslání na IP adresu a časové okno. To zastaví záplavy z jednoho zdroje; spam rozložený mezi mnoho adres vyžaduje další vrstvy.
  • Zvažte proof-of-work: před odesláním prohlížeč vyřeší malou výpočetní úlohu. Návštěvníci nevidí žádnou hádanku a nic se nesleduje, ale hromadné odesílání se prodraží.

Rozumná kombinace: dvě nebo tři vrstvy

  1. 1Začněte neviditelnými vrstvami: přístupným honeypotem a podepsanou časovou pastí, obojí kontrolované na serveru.
  2. 2Přidejte omezení četnosti na IP adresu, aby jeden zdroj nemohl formulář zahltit.
  3. 3Pokud cílený spam stále proniká, přidejte proof-of-work nebo CAPTCHA – nejlépe takovou bez viditelné hádanky a s přístupnou alternativou.
  4. 4Ponechte token CSRF, který poskytuje váš framework – jako bonus, ne jako obranu.
  5. 5Otestujte výsledek jako návštěvník – pouze klávesnicí, se čtečkou obrazovky, na telefonu – a ověřte, že skutečné zprávy stále docházejí.

Na mnoha webech honeypot, časová past a omezení četnosti společně odstraní většinu obecného spamu bez jakékoli viditelné překážky; CAPTCHA je rezerva pro případ, kdy to nestačí. Ve WordPressu kombinuje bezplatný plugin formexposed honeypot, časovou kontrolu a proof-of-work bez potřeby Googlu. Chcete-li vidět, co váš formulář ukazuje navenek – které vrstvy jsou přítomny a zda je CAPTCHA účinně nastavena –, stačí bezplatné kontrole na formexposed.com jen doména, žádný účet. Kód vašeho serveru nevidí, takže část na straně serveru zůstává vaším úkolem.