Què protegeix realment un formulari: CAPTCHA, camp trampa, trampa temporal i CSRF
La majoria de formularis de contacte confien en un sol recurs contra l'spam, i molts d'aquests recursos només aturen els bots més simples. Què atura cada capa de protecció, quin cost té i quina combinació té sentit.
L'spam a través dels formularis de contacte poques vegades prové d'una persona que escriu a mà. Normalment és programari que troba formularis, n'emplena tots els camps i n'envia el resultat milers de vegades. Hi ha diverses defenses, i actuen en punts molt diferents. Saber què fa realment cadascuna ajuda a evitar dos errors: un formulari sense protecció real i un formulari tan vigilat que les persones reals desisteixen.
- Camp trampa: bots simples que emplenen tots els camps
- Trampa temporal: scripts que envien el formulari immediatament després de carregar la pàgina
- CAPTCHA: la major part de l'automatització genèrica
- Testimoni CSRF: peticions enviades directament al punt d'entrada
- Limitació de freqüència: allaus d'una única font
- Prova de treball: enviaments massius de baix cost, sense seguiment ni trencaclosques
- Comprovacions al servidor: tot allò que evita passar pel navegador
- Els bots dissenyats específicament se'l salten; si està mal amagat, els lectors de pantalla l'anuncien
- Bots que esperen; sense una signatura del servidor és fàcil de falsificar
- Un obstacle per a tothom, barreres d'accessibilitat, sovint de tercers; existeixen serveis que els resolen
- Els bots que primer carreguen la pàgina també obtenen un testimoni vàlid
- Missatges brossa distribuïts entre moltes adreces IP
- Un remitent decidit amb potència de càlcul; necessita JavaScript
- Cap cosa per si sola, però sense aquestes comprovacions qualsevol altra capa és decorativa
Camp trampa i trampa temporal: filtres invisibles
Un camp trampa és un camp addicional que les persones no veuen mai, com ara un camp anomenat «website» ocult amb CSS. Els bots senzills emplenen tots els camps; per tant, un camp trampa emplenat indica automatització i el servidor pot descartar el missatge discretament. Els bots escrits per al seu lloc web, o els que renderitzen la pàgina com un navegador, el deixen buit. Oculti'l correctament: un camp simplement desplaçat fora de la pantalla pot ser anunciat pels lectors de pantalla, rebre el focus amb la tecla Tab o ser emplenat per la compleció automàtica. Utilitzi aria-hidden, tabindex -1 i autocomplete off, a més d'una etiqueta neutra que demani a qualsevol persona que hi arribi que el deixi buit.
Una trampa temporal registra quan s'ha lliurat el formulari i rebutja els enviaments que arriben amb una rapidesa inversemblant. Les persones necessiten uns quants segons per llegir i escriure; molts scripts envien en una fracció de segon. La marca de temps s'ha de comprovar al servidor i protegir contra manipulacions, per exemple amb una signatura o conservant-la a la sessió: el bot simplement reescriu un camp de temps ocult sense protecció. Mantingui un llindar baix, perquè la compleció automàtica també permet que les persones reals siguin ràpides. Els bots que simplement esperen aconsegueixen passar: una trampa temporal és un filtre, no un mur.
CAPTCHA: eficaç, però no gratuït
Un CAPTCHA demana una prova que no hi ha cap bot actuant: des de trencaclosques d'imatges fins a comprovacions que s'executen en segon pla; entre els serveis habituals hi ha reCAPTCHA, hCaptcha, Cloudflare Turnstile i Friendly Captcha. Atura la majoria d'automatitzacions genèriques, i per això és tan popular. Però cada trencaclosques visible és un obstacle davant del qual alguns visitants abandonen, i la majoria de serveis carreguen un script d'un tercer, cosa que planteja qüestions de privacitat i consentiment. A més, un CAPTCHA només ajuda si està configurat correctament: una clau de lloc pública de prova, un giny sense el seu script o un testimoni que el servidor mai no verifica semblen protecció, però no ho són. Una comprovació gratuïta a formexposed.com assenyala aquests errors des de l'exterior.
L'accessibilitat forma part d'aquest cost. Els trencaclosques d'imatges exclouen les persones cegues i moltes persones amb baixa visió, les alternatives d'àudio no ajuden les persones sordcegues i les tasques de lògica complicades suposen una càrrega per a les persones amb discapacitats cognitives. El criteri de conformitat 1.1.1 de les WCAG 2.2 exigeix una alternativa textual que descrigui la finalitat del CAPTCHA i formes alternatives per a diferents sentits. Les comprovacions en segon pla eviten la major part d'aquests problemes, però quan detecten alguna cosa sospitosa, l'alternativa sovint torna a ser un trencaclosques visual: provi aquest recorregut amb un teclat i un lector de pantalla.
Testimoni CSRF: protecció contra la falsificació, no contra els missatges brossa
Un testimoni CSRF és un valor aleatori que el servidor introdueix al formulari i espera rebre de tornada. Es va dissenyar per combatre la falsificació de peticions entre llocs web, en què un altre lloc web fa que el navegador d'un visitant enviï una petició que aquest mai no havia volgut fer. En un formulari de contacte públic té un efecte secundari: es rebutgen els bots que envien directament a l'adreça del formulari sense carregar la pàgina. Qualsevol bot que obtingui la pàgina i retorni el testimoni aconsegueix passar. La majoria de frameworks i connectors de formularis ja inclouen testimonis CSRF: mantingui'ls activats, però no els compti com a protecció contra els missatges brossa.
Què ha de passar al servidor
- Validi de nou tots els camps al servidor: camps obligatoris, longitud, format del correu electrònic i absència de salts de línia als camps que acaben a les capçaleres dels correus.
- Verifiqui els testimonis CAPTCHA i de prova de treball en cada enviament, amb el servei emissor o al seu propi codi, i rebutgi els testimonis que es reutilitzin.
- Limiti els enviaments per adreça IP i interval de temps. Això atura les allaus d'una única font; els missatges brossa distribuïts entre moltes adreces necessiten altres capes.
- Valori la prova de treball: abans d'enviar, el navegador resol una petita tasca de càlcul. Els visitants no veuen cap trencaclosques i no es fa cap seguiment, però els enviaments massius es tornen costosos.
Una combinació raonable: dues o tres capes
- 1Comenci per les capes invisibles: un camp trampa accessible i una trampa temporal signada, tots dos comprovats al servidor.
- 2Afegeixi una limitació de freqüència per adreça IP perquè una única font no pugui inundar el formulari.
- 3Si encara hi passen missatges brossa dirigits específicament al seu lloc, afegeixi una prova de treball o un CAPTCHA, preferiblement sense trencaclosques visible i amb una alternativa accessible.
- 4Mantingui el testimoni CSRF que proporciona el seu framework com a complement, no com a defensa.
- 5Provi el resultat com un visitant —només amb el teclat, amb un lector de pantalla, des d'un telèfon— i comprovi que els missatges reals continuen arribant.
En molts llocs web, el camp trampa, la trampa temporal i la limitació de freqüència junts ja eliminen la majoria dels missatges brossa genèrics sense cap obstacle visible; el CAPTCHA queda de reserva per quan això no és suficient. A WordPress, el connector gratuït de formexposed combina camp trampa, comprovació temporal i prova de treball sense necessitar Google. Per veure què mostra el seu formulari des de l'exterior —quines capes hi ha i si un CAPTCHA està configurat de manera eficaç—, una comprovació gratuïta a formexposed.com només necessita un domini, sense compte. No pot veure el codi del seu servidor; per tant, la part del servidor continua sent responsabilitat seva.