Ce protejează cu adevărat un formular: CAPTCHA, honeypot, capcană de timp, CSRF
Majoritatea formularelor de contact se bazează pe un singur truc împotriva spamului, iar multe dintre aceste trucuri opresc doar cei mai simpli boți. Ce oprește fiecare strat de protecție, ce costă și ce combinație are sens.
Spamul prin formularele de contact provine rareori de la o persoană care tastează manual. De cele mai multe ori este vorba de software care găsește formulare, completează fiecare câmp și trimite rezultatul – de mii de ori. Există mai multe mijloace de apărare, iar ele acționează în puncte foarte diferite. Dacă știți ce face cu adevărat fiecare, evitați două greșeli: un formular fără protecție reală și un formular păzit atât de strict încât oamenii reali renunță.
- Honeypot: boții simpli care completează fiecare câmp
- Capcană de timp: scripturile care trimit imediat după încărcare
- CAPTCHA: majoritatea automatizărilor generice
- Token CSRF: cererile trimise direct către endpoint
- Limitarea ratei: avalanșele dintr-o singură sursă
- Proof-of-work: trimiterile ieftine în masă, fără urmărire sau puzzle-uri
- Verificările pe server: tot ce ocolește browserul
- Boții țintiți îl ocolesc; dacă este ascuns prost, cititoarele de ecran îl anunță
- Boții care așteaptă; fără o semnătură pe server este ușor de falsificat
- Un obstacol pentru toată lumea, bariere de accesibilitate, adesea de la terți; există servicii de rezolvare
- Boții care încarcă mai întâi pagina primesc și ei un token valid
- Spamul distribuit pe multe adrese IP
- Un expeditor hotărât, cu putere de calcul; necesită JavaScript
- Nimic singure – dar fără ele orice alt strat este doar decor
Honeypot și capcană de timp: filtre invizibile
Un honeypot este un câmp suplimentar pe care oamenii nu îl văd niciodată, de exemplu un câmp numit „website”, ascuns cu CSS. Boții simpli completează fiecare câmp, așa că un honeypot completat semnalează automatizare, iar serverul poate elimina discret mesajul. Boții scriși special pentru site-ul dumneavoastră sau cei care redau pagina ca un browser îl ocolesc. Ascundeți-l corect: un câmp doar mutat în afara ecranului poate fi anunțat de cititoarele de ecran, atins cu tasta Tab sau completat de completarea automată. Utilizați aria-hidden, tabindex -1 și autocomplete off, plus o etichetă neutră care roagă pe oricine ajunge acolo să îl lase gol.
O capcană de timp înregistrează momentul în care a fost livrat formularul și respinge trimiterile care sosesc neplauzibil de repede. Oamenii au nevoie de câteva secunde pentru a citi și a tasta; multe scripturi trimit într-o fracțiune de secundă. Marcajul temporal trebuie verificat pe server și protejat împotriva manipulării, de exemplu semnat sau păstrat în sesiune – un simplu câmp ascuns cu ora este pur și simplu rescris de bot. Mențineți pragul scăzut, deoarece completarea automată îi face rapizi și pe oamenii reali. Boții care pur și simplu așteaptă trec: o capcană de timp este un filtru, nu un zid.
CAPTCHA: eficient, dar nu gratuit
Un CAPTCHA cere dovada că nu lucrează un bot – de la puzzle-uri cu imagini până la verificări care rulează în fundal; servicii frecvente sunt reCAPTCHA, hCaptcha, Cloudflare Turnstile și Friendly Captcha. El oprește majoritatea automatizărilor generice, de aceea este atât de popular. Însă fiecare puzzle vizibil este un obstacol la care unii vizitatori renunță, iar majoritatea serviciilor încarcă un script de la terți, ceea ce ridică întrebări privind confidențialitatea și consimțământul. Un CAPTCHA ajută, de asemenea, doar dacă este configurat corect: o cheie de site de test publică, un widget fără scriptul său sau un token pe care serverul nu îl verifică niciodată arată ca o protecție, dar nu este. O verificare gratuită pe formexposed.com semnalează astfel de erori din exterior.
Accesibilitatea face parte din acest cost. Puzzle-urile cu imagini îi exclud pe nevăzători și pe multe persoane cu vedere slabă, alternativele audio nu le ajută pe persoanele cu surdocecitate, iar sarcinile logice complicate le împovărează pe persoanele cu deficiențe cognitive. Criteriul de succes 1.1.1 din WCAG 2.2 impune o alternativă text care descrie scopul CAPTCHA-ului și forme alternative pentru simțuri diferite. Verificările în fundal evită cea mai mare parte a acestor probleme, dar când devin suspicioase, varianta de rezervă este adesea tot un puzzle vizual – testați acest parcurs cu tastatura și cu un cititor de ecran.
Token CSRF: protecție împotriva falsificării, nu împotriva spamului
Un token CSRF este o valoare aleatorie pe care serverul o pune în formular și se așteaptă să o primească înapoi. A fost conceput împotriva falsificării cererilor între site-uri (cross-site request forgery), în care un alt site face ca browserul unui vizitator să trimită o cerere pe care vizitatorul nu a intenționat-o niciodată. Pe un formular de contact public are un efect secundar: boții care trimit direct la adresa formularului fără a încărca pagina sunt respinși. Orice bot care preia pagina și trimite tokenul înapoi trece. Majoritatea frameworkurilor și pluginurilor de formulare includ oricum tokenuri CSRF – păstrați-le active, dar nu le considerați protecție antispam.
Ce trebuie să se întâmple pe server
- Validați din nou fiecare câmp pe server: câmpurile obligatorii, lungimea, formatul e-mailului și absența sfârșiturilor de rând în câmpurile care ajung în antetele e-mailului.
- Verificați tokenurile CAPTCHA și proof-of-work la fiecare trimitere, la serviciul emitent sau în propriul cod, și respingeți tokenurile reutilizate.
- Limitați trimiterile per adresă IP și interval de timp. Astfel opriți avalanșele dintr-o singură sursă; spamul distribuit pe multe adrese necesită alte straturi.
- Luați în considerare proof-of-work: înainte de trimitere, browserul rezolvă o mică sarcină de calcul. Vizitatorii nu văd niciun puzzle și nimic nu este urmărit, dar trimiterea în masă devine costisitoare.
O combinație rezonabilă: două sau trei straturi
- 1Începeți cu straturile invizibile: un honeypot accesibil și o capcană de timp semnată, ambele verificate pe server.
- 2Adăugați o limitare a ratei per adresă IP, astfel încât o singură sursă să nu poată inunda formularul.
- 3Dacă spamul țintit tot trece, adăugați proof-of-work sau un CAPTCHA – de preferință unul fără puzzle vizibil și cu o alternativă accesibilă.
- 4Păstrați tokenul CSRF oferit de frameworkul dumneavoastră – ca bonus, nu ca mijloc de apărare.
- 5Testați rezultatul ca vizitator – doar cu tastatura, cu un cititor de ecran, pe telefon – și verificați că mesajele reale încă sosesc.
Pe multe site-uri, honeypotul, capcana de timp și limitarea ratei elimină împreună deja cea mai mare parte a spamului generic, fără niciun obstacol vizibil; un CAPTCHA este rezerva pentru situațiile în care acest lucru nu este suficient. Pe WordPress, pluginul gratuit formexposed combină honeypotul, verificarea timpului și proof-of-work fără a avea nevoie de Google. Pentru a vedea ce arată formularul dumneavoastră din exterior – ce straturi sunt prezente, dacă un CAPTCHA este configurat eficient –, o verificare gratuită pe formexposed.com necesită doar un domeniu, fără cont. Ea nu vă poate vedea codul de pe server, așa că partea de pe server rămâne sarcina dumneavoastră.