Como acabar com spam no formulário de contato: honeypot, armadilha de tempo, CAPTCHA | We.Inc
Acabe com o spam no formulário de contato do seu site com um campo honeypot, uma armadilha de tempo e um CAPTCHA grátis como Turnstile, reCAPTCHA ou hCaptcha, verificado no seu servidor. Demonstração ao vivo.
Como acabar com spam no formulário de contato
Use primeiro as verificações baratas e só depois as que incomodam. Adicione um campo honeypot oculto que as pessoas nunca veem mas os bots preenchem, rejeite formulários enviados mais rápido do que uma pessoa conseguiria digitar e, se o spam continuar passando, adicione um serviço de CAPTCHA como Turnstile, reCAPTCHA ou hCaptcha cujo token o seu servidor verifica.
Defesas contra spam comparadas
Método
O que o visitante percebe
Bloqueia
Precisa de código no servidor
Campo honeypot
Nada
Bots simples que preenchem todos os campos
Sim, uma verificação de uma linha
Armadilha de tempo
Nada
Bots que enviam na hora
Sim
Cloudflare Turnstile
Normalmente nada, às vezes uma caixa de seleção
A maior parte dos envios automatizados
Sim, uma chamada ao siteverify
reCAPTCHA v3
Nada; você recebe uma pontuação
A maior parte dos envios automatizados
Sim, verificar e escolher um limite
hCaptcha
Às vezes um desafio
A maior parte dos envios automatizados
Sim, uma chamada ao siteverify
Bots de spam varrem a web atrás de formulários e enviam mensagens para eles automaticamente. O seu servidor não vê quem está digitando, então toda defesa funciona identificando um comportamento que uma pessoa não teria, ou pedindo a um serviço separado que garanta o visitante. Teste as duas primeiras defesas na demonstração e depois copie a verificação de servidor que acompanha cada uma.
Adicione um campo extra com um nome tentador, como website, e esconda esse campo com CSS em vez de type=hidden.
Adicione um campo oculto com o horário em que o formulário foi exibido.
No servidor, descarte qualquer envio em que a armadilha tenha valor ou em que o intervalo de tempo seja menor que alguns segundos.
Se o spam continuar, adicione um widget de CAPTCHA e verifique o token dele no servidor antes de salvar ou enviar a mensagem por e-mail.
Aceite e descarte em silêncio os envios pegos na armadilha. Mostrar um erro ensina ao bot o que mudar.
Dê ao campo armadilha tabindex="-1" e aria-hidden="true" para que quem usa teclado ou leitor de tela nunca caia nele.
Mantenha a armadilha de tempo curta, por volta de três segundos. O preenchimento automático do navegador permite que pessoas reais terminem um formulário rapidinho.
Nunca coloque a chave secreta do CAPTCHA no código da página. Ela fica apenas no servidor.
Perguntas frequentes
O que é um campo honeypot?
Um campo que está no código do formulário mas fica escondido das pessoas. Os visitantes o deixam vazio porque nunca o veem; os bots que preenchem todos os campos que encontram colocam algo nele, e isso os denuncia.
Existe uma alternativa grátis ao reCAPTCHA?
Sim. Cloudflare Turnstile e hCaptcha oferecem planos grátis com o mesmo formato: um script e um widget na página, depois uma chamada do servidor a um endereço siteverify com a sua chave secreta e o token do visitante. Confira a página de planos atual de cada fornecedor para ver os limites.
O reCAPTCHA v3 mostra um desafio?
Não. A documentação do Google diz que o v3 retorna uma pontuação em que 1.0 é muito provavelmente uma interação legítima e 0.0 é muito provavelmente um bot, e sugere começar com um limite de 0.5. Você decide o que fazer com as pontuações baixas.
Só o widget basta para bloquear spam?
Não. A documentação da Cloudflare diz com todas as letras que o widget no navegador, sozinho, não protege os seus formulários. Um bot pode enviar direto para o endereço do formulário, então o servidor precisa verificar o token.
Por que ainda recebo spam com um honeypot?
Alguns bots rodam um navegador de verdade e só preenchem campos visíveis, e parte do spam é digitada por pessoas. Adicione a armadilha de tempo e depois um CAPTCHA. Rejeite também mensagens cheias de links se o seu formulário nunca precisa deles.
Por que as verificações grátis vêm primeiro
Um honeypot e uma armadilha de tempo não custam nada ao visitante e pegam a grande parte do spam que vem de scripts rudimentares. Um CAPTCHA adiciona um script de terceiros, um item na política de privacidade e às vezes um desafio, então guarde-o para quando precisar.
Esconda a armadilha do jeito certo
Use CSS que leve o campo para fora da tela em vez de type="hidden", porque muitos bots ignoram campos ocultos. Desative o preenchimento automático nele com autocomplete="off", já que um navegador que o preenchesse marcaria uma pessoa real como bot.
O MDN observa que os navegadores podem ignorar autocomplete="off" em campos de login, então não dê à armadilha o nome email ou password.
Verifique os tokens de CAPTCHA no servidor
Cada serviço coloca um token no formulário. O seu servidor envia esse token com a sua chave secreta para o endereço siteverify do fornecedor e só continua se a resposta disser que success é true.
Os tokens do Turnstile valem por 300 segundos e só podem ser verificados uma vez. Os tokens do reCAPTCHA v3 duram dois minutos, então peça um quando o visitante enviar o formulário, não ao carregar a página.
Copie o honeypot e a armadilha de tempo
O HTML vai no seu formulário. A verificação no servidor aparece em Node com Express, mas a lógica cabe em três linhas em qualquer linguagem.
Formulário com campo honeypot
A classe .hp leva a armadilha para fora da tela. O campo started recebe o horário atual por meio do pequeno script.
Verificação no servidor (Node, Express)
Os bots recebem a mesma resposta que as pessoas, assim não conseguem descobrir qual verificação os pegou.
Como adicionar Turnstile, reCAPTCHA ou hCaptcha
Os três funcionam do mesmo jeito. Estes detalhes vêm da documentação de cada fornecedor.
Serviços de CAPTCHA lado a lado
Turnstile
reCAPTCHA v3
hCaptcha
Script
Carregado do Google com a sua site key
Widget
<div class="cf-turnstile" data-sitekey>
Sem widget; chame execute no envio
<div class="h-captcha" data-sitekey>
Verificar em
challenges.cloudflare.com/turnstile/v0/siteverify
Endpoint de verificação do Google
api.hcaptcha.com/siteverify
Validade do token
300 segundos, uso único
Dois minutos
Veja a documentação do fornecedor
Resultado
success true ou false
success mais uma pontuação de 0.0 a 1.0
success true ou false
Verificar um token do Turnstile (Node 18 ou posterior)
O widget adiciona ao seu formulário um campo chamado cf-turnstile-response. Guarde a chave secreta em uma variável de ambiente.
Demonstração ao vivo: honeypot mais armadilha de tempo
Nada é enviado para lugar nenhum. Ao clicar em Enviar, as mesmas verificações que um servidor faria rodam aqui mesmo, no seu navegador.
Seu nome
Mensagem
Site (deixe em branco)
Agir como um bot: preencher o campo oculto
Enviar
Recomeçar
Preencha o formulário e clique em Enviar para ver o que a verificação do servidor decide.
Aceito: a armadilha estava vazia e passaram {n} segundos. Um formulário real enviaria a mensagem agora.
Descartado: o campo oculto tinha um valor, então isso parece um bot. O visitante continuaria vendo uma mensagem de agradecimento.
Descartado: enviado após {n} segundos, mais rápido que o mínimo de {m} segundos.
O campo oculto aparece aqui, destacado com contorno, para você ver o que os bots veem.