Acabe com o spam no formulário de contato

Acabe com o spam no formulário de contato7 min de leitura

Alternativas ao reCAPTCHA para formulários de sites

Compare alternativas ao reCAPTCHA para formulários, do Turnstile e hCaptcha a prova de trabalho e nenhum captcha, e migre com uma mudança pequena e segura.

Preet SutharFundador, Ikiform

O Cloudflare Turnstile é a troca mais direta para o reCAPTCHA: é quase sempre invisível, usa o mesmo esquema de site key e chave secreta, e a verificação no servidor recebe os mesmos parâmetros. O hCaptcha serve para sites que querem desafios de imagem de alguém que não seja o Google, e ferramentas de prova de trabalho como o ALTCHA rodam sem terceiro nenhum. Para muitos formulários de contato, um honeypot, pontuação de conteúdo e um limite de taxa tornam o captcha desnecessário.

Por que as pessoas abandonam o reCAPTCHA

O reCAPTCHA ainda funciona. Os motivos para substituí-lo costumam ser o custo para os visitantes e para você. A versão 2 mostra quebra-cabeças de imagem a alguns visitantes, o que é lento no celular e difícil para quem usa leitor de tela. A versão 3 é invisível, mas devolve uma pontuação cujo corte você mesmo precisa definir, sem desafio de reserva. E o reCAPTCHA agora é um produto do Google Cloud: a documentação de faturamento do Google lista uma cota gratuita de 10.000 avaliações por mês, com faixas pagas acima disso.

Algumas equipes também querem menos scripts de terceiros nas páginas. Se isso importa para suas obrigações de privacidade é uma questão para sua própria análise jurídica; esta página só compara como as ferramentas funcionam.

As alternativas comparadas

OpçãoO que os visitantes veemQuem validaVale saber
reCAPTCHA v2Uma caixa de seleção, às vezes quebra-cabeças de imagemSeu servidor, com o GoogleConhecido. Os quebra-cabeças são a principal reclamação
reCAPTCHA v3NadaSeu servidor, com o GoogleDevolve uma pontuação de 0,0 a 1,0. Você escolhe o corte e lida com a zona cinzenta
Cloudflare TurnstileQuase sempre nada, às vezes uma caixa de seleçãoSeu servidor, com a CloudflareSem quebra-cabeças de imagem. Sem custo para até 20 widgets
hCaptchaUma caixa de seleção, às vezes quebra-cabeças de imagemSeu servidor, com o hCaptchaFormato parecido com o do reCAPTCHA v2, de outra empresa. Um plano Basic gratuito, com planos pagos Pro e Enterprise
Friendly CaptchaUm pequeno widget que resolve um quebra-cabeça em segundo planoSeu servidor, com o Friendly CaptchaProva de trabalho em vez de sinais de rastreamento. Gratuito para sites pequenos não comerciais, planos pagos para os demais
ALTCHAUm pequeno widget que resolve um quebra-cabeça em segundo planoSó o seu próprio servidorCódigo aberto e auto-hospedado, então sem terceiros. Você roda e mantém
No captchaNadaSeu servidorHoneypot, tempo assinado, pontuação de conteúdo e limites de taxa. Barra a maioria dos bots, não todos

Toda opção, menos a última, ainda depende de uma verificação no servidor. Um widget sozinho não barra nada, porque um bot pode enviar para o seu endpoint sem carregar a página.

O que cada opção exige das pessoas

Avalie cada opção pelo visitante que tem mais dificuldade com ela. Quebra-cabeças de imagem são lentos no celular e difíceis ou impossíveis para quem não enxerga bem; alternativas em áudio ajudam algumas pessoas e frustram outras. Verificações invisíveis, como o modo usual do Turnstile, o reCAPTCHA v3 e os widgets de prova de trabalho, não pedem nada à maioria dos visitantes, mas ainda podem falhar para quem usa navegadores focados em privacidade, redes restritivas ou aparelhos antigos. Quando isso acontece, a pessoa precisa de uma saída: uma caixa de seleção visível, uma mensagem clara ou um endereço de e-mail para escrever. Um formulário que falha em silêncio perde justamente as mensagens de que você nunca fica sabendo.

Escolha em duas perguntas

Escolhendo um substituto para o reCAPTCHA em duas perguntasComece aquiSem servidor: um site estático ou um construtorbots passampelasverificaçõesinvisíveis?dá para rodarcódigo noservidor?seu próprio widgetTurnstile, hCaptcha ouALTCHAfique sem captchahoneypot, pontuação,limite de taxaformulário envia aum backendbackend validasuas chavessó Turnstile, com oIkiformou verificaçãogerenciadasem chave nenhumasimsimnãoEscolhendo um substituto para o reCAPTCHA em duas perguntasComece aquiSem servidor: um site estático ou um construtorbots passampelasverificaçõesinvisíveis?dá pararodarcódigo noservidor?seu própriowidgetTurnstile, hCaptchaou ALTCHAfiquesemcaptchahoneypot,pontuação,limite detaxaformulárioenvia a umbackendbackend validasuas chavessó Turnstile, com oIkiformou verificaçãogerenciadasem chave nenhumasimsimnão
  1. Primeiro, pergunte se bots passam pelas verificações invisíveis. Se não, fique sem captcha, com honeypot, pontuação e limite de taxa.
  2. Se passam, pergunte se você pode rodar código no servidor. Se pode, escolha um widget como Turnstile, hCaptcha ou ALTCHA e valide-o no seu servidor.
  3. Sem servidor, envie o formulário a um backend que valide suas chaves do Turnstile por você, ou use uma verificação gerenciada que dispensa chaves.
A maioria dos formulários de contato para na primeira pergunta. Meça seu spam antes de adicionar qualquer widget.

Migre do reCAPTCHA para o Turnstile

Os dois são parecidos o bastante para a migração ser de poucas linhas de cada lado. Crie um widget do Turnstile no painel da Cloudflare para os mesmos hostnames e depois mude o markup e a verificação no servidor juntos.

PartereCAPTCHA v2Turnstile
Scripthttps://www.google.com/recaptcha/api.jshttps://challenges.cloudflare.com/turnstile/v0/api.js
Elemento<div class="g-recaptcha" data-sitekey><div class="cf-turnstile" data-sitekey>
Campo do tokeng-recaptcha-responsecf-turnstile-response
URL de validaçãohttps://www.google.com/recaptcha/api/siteverifyhttps://challenges.cloudflare.com/turnstile/v0/siteverify
Parâmetros de validaçãosecret, response, remoteipsecret, response, remoteip, idempotency_key
<form action="/api/contact" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <div class="g-recaptcha" data-sitekey="RECAPTCHA_SITE_KEY"></div>
  <button>Send</button>
</form>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
const form = await request.formData();
const body = new URLSearchParams({
  secret: process.env.RECAPTCHA_SECRET_KEY!,
  response: String(form.get("g-recaptcha-response") ?? ""),
});
const check = await fetch("https://www.google.com/recaptcha/api/siteverify", { method: "POST", body });
const { success } = (await check.json()) as { success: boolean };
  • Isso cobre as chaves clássicas do reCAPTCHA, validadas em siteverify. Chaves criadas no Google Cloud são conferidas pela API de avaliações do reCAPTCHA Enterprise; o lado do Turnstile é o mesmo.
  • Se você usava a v3, remova seu corte de pontuação. O Turnstile responde passou ou falhou; confira action na resposta dele.
  • Atualize sua Content Security Policy: permita https://challenges.cloudflare.com em script-src e frame-src, e tire as entradas do Google quando nada mais as usar.
  • Publique o markup e a mudança no servidor num único deploy. Uma página com o widget novo enviando para um servidor que ainda espera g-recaptcha-response falha em todo envio.

Substituindo o reCAPTCHA pelo Ikiform

Se seu formulário envia ao Ikiform, remova o widget do reCAPTCHA por completo. O Ikiform não valida tokens do reCAPTCHA nem do hCaptcha. O valor g-recaptcha-response que sobrar chegaria como campo extra, ou falharia com 422 validation_failed como campo desconhecido se você tiver definido os campos do formulário. Depois escolha o que o substitui:

  • Nada a mais. O honeypot, a pontuação de conteúdo e os limites de taxa rodam em todo formulário. Muitos formulários de contato não precisam de mais nada.
  • Spam check definido como Ikiform. Cloudflare Turnstile, rodado pelo Ikiform, sem conta nem chaves. Um envio HTML simples recebe uma breve página de verificação; código com fetch chama challenge() de @ikiform/sdk.
  • Suas próprias chaves do Turnstile. Mantenha seu próprio widget na página, cole as chaves nas configurações do formulário e o Ikiform valida o token.
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send</button>
</form>

Esse formulário não tem widget nenhum. Com Spam check em Ikiform, a verificação humana acontece em ikiform.com depois do envio, então sua página não carrega script de captcha. A documentação de spam cobre cada modo.

Se você também está saindo de um serviço de formulários hospedado, as páginas de comparação do Formspree e do Netlify Forms cobrem o que mais muda.

Confira se funciona

  1. Envie o formulário após a migração. O envio é aceito e você viu no máximo uma caixa de seleção.
  2. Envie ao endpoint com curl e sem token. Ele é recusado, o que prova que o servidor confere o token novo.
  3. Procure g-recaptcha e recaptcha/api.js nas suas páginas. Não sobrou nada.
  4. Abra Submissions no painel. O novo envio está lá com todos os campos que você mandou.
  5. Nada chegou? Mude o filtro de status do painel para Spam. O spam recebe a mesma resposta de sucesso que um envio real.

Pegadinhas

  • Configurações do construtor. Construtores de site com uma opção de reCAPTCHA embutida podem exigir o elemento em todo formulário enquanto ela estiver ligada. Desligue a opção antes de remover os elementos.
  • Páginas em cache. Visitantes com uma página antiga em cache ainda enviam g-recaptcha-response por um tempo depois do deploy. Conte com algumas falhas, ou aceite os dois tokens por um dia.
  • Pontuações da v3 em relatórios. Se painéis ou alertas leem a pontuação do reCAPTCHA, eles ficam mudos após a migração. Atualize-os.

Perguntas

Travou em algum passo ou quer um guia para o seu caso? Envie um e-mail para hello@ikiform.com.