Acabe com o spam no formulário de contato7 min de leitura
Como acabar com o spam em formulários do Webflow
Proteja um formulário do Webflow que envia a um backend de formulários, onde as opções de spam do Webflow nunca rodam, com um honeypot fora da tela e verificação humana.
O reCAPTCHA, o bloqueio de bots e o filtro de spam do Webflow só funcionam em envios que o próprio Webflow recebe. Se seu formulário usa uma custom action para enviar a um backend de formulários, essas opções nunca veem o envio, então a proteção precisa acontecer no backend. Adicione um honeypot fora da tela no Designer, defina seus domínios e seu limite de taxa no backend e ative a verificação humana dele, que funciona com o envio normal do Webflow e sem código.
O que muda no Webflow
O Webflow tem suas próprias ferramentas contra spam: o reCAPTCHA v2, uma opção de bloqueio de bots que roda o Cloudflare Turnstile e um filtro de spam que lê o conteúdo de cada envio. Todas ficam do lado do Webflow, então só agem sobre envios que chegam ao Webflow. No momento em que você define o Send to de um formulário como uma custom action, o navegador envia direto para essa URL. O Webflow nunca vê o envio, então nenhuma das verificações dele roda, seja qual for a configuração.
- Quando o Webflow cuida do formulário, o envio vai para o Webflow, que roda o reCAPTCHA, o bloqueio de bots e o filtro de spam antes de guardá-lo.
- Com uma custom action, o navegador envia o mesmo formulário direto ao Ikiform.
- As verificações do Webflow nunca veem esse envio, seja qual for a configuração.
- O Ikiform roda o honeypot, a pontuação, o limite de taxa e a verificação humana, e guarda o envio como recebido ou spam.
As opções do próprio Webflow, depois da mudança
| Opção do Webflow | Com uma custom action | O que fazer |
|---|---|---|
| Elemento e validação do reCAPTCHA | Ninguém valida. O valor g-recaptcha-response dele chega como campo extra | Remova o elemento. Desative a validação do reCAPTCHA só se nenhum formulário que o Webflow ainda cuida precisar dela, porque a opção vale para todos os formulários do site |
| Bloqueio de bots | Não se aplica a envios que vão para outro lugar | Mantenha para os formulários que o Webflow ainda cuida |
| Filtro de spam | Não se aplica | Use a pontuação de conteúdo do backend no lugar |
| Limites de envio e notificações de formulário | Não se aplicam | O backend guarda e manda os e-mails no lugar |
O guia do Webflow na documentação cobre como apontar o Form Block para o Ikiform. Os passos abaixo adicionam a proteção contra spam por cima.
Adicione o honeypot no Designer
O jeito rápido do Webflow de esconder um campo é Display: none. Alguns bots pulam campos escondidos assim, então coloque a armadilha num contêiner fora da tela. Leva um minuto e não exige plano pago:
- Dentro do formulário, adicione um Div Block e dê a ele uma classe como
hp. No painel Style, defina Position como Absolute, Left como-10000px, Width e Height como1pxe Overflow como Hidden. - Em Custom attributes do Div Block, adicione
aria-hiddencom valortrue, para que leitores de tela pulem tudo o que está dentro dele. - Coloque dentro do Div Block um Label com o texto Leave this empty e um Input. Defina o Name do Input como
_gotchae adicione os atributos personalizadostabindex=-1eautocomplete=off. - Não marque Required nele. Um campo obrigatório que ninguém vê bloqueia todo envio honesto.
Um _gotcha preenchido soma 5 à pontuação de spam do Ikiform, o suficiente para atingir sozinho o limite de 5. Você pode renomear o campo por formulário em Honeypot field se um modelo que você usa já tiver uma armadilha com outro nome.
Dê nomes aos campos pensando na pontuação
O Webflow nomeia cada campo a partir do rótulo, então você recebe Name, Email e Field 2. Renomeie-os nas configurações de cada campo para name, email e message. Os nomes importam para a pontuação de spam, além dos seus dados:
- Um link num campo de nome, como
name,first_nameousubject, soma 3. Spammers costumam colocar a URL ali, e nenhuma pessoa real faz isso. - Um endereço num domínio de e-mail descartável soma 2, lido de qualquer campo que contenha um endereço de e-mail.
- Três ou mais links no formulário somam 2, e uma frase de spam conhecida soma 2.
Ative a verificação humana
Nas configurações do formulário no Ikiform, defina Spam check como Ikiform. Nada muda no Webflow. Quando o formulário envia do jeito normal, o Ikiform responde com uma breve página Checking you're human (verificando se você é humano) em ikiform.com que roda o Cloudflare Turnstile e repassa os campos, e então o visitante cai na sua página de Redirect after submit. Sem conta na Cloudflare, sem chaves, sem código personalizado.
Se você adicionou o script da documentação para manter os blocos de sucesso e de erro do Webflow, ele envia com fetch, e um envio com fetch sem token recebe 403 challenge_required. Esta versão cuida disso: volta para um envio normal para a verificação humana e mostra o tempo de espera quando um visitante bate no limite de taxa.
<script>
document.querySelectorAll('form[action^="https://ikiform.com/f/"]').forEach((form) => {
const wrapper = form.closest(".w-form");
const done = wrapper?.querySelector(".w-form-done");
const fail = wrapper?.querySelector(".w-form-fail");
const button = form.querySelector('[type="submit"]');
function showError(text) {
const slot = fail?.querySelector("div") ?? fail;
if (slot) slot.textContent = text;
if (fail) fail.style.display = "block";
}
form.addEventListener("submit", async (event) => {
event.preventDefault();
const label = button?.value;
if (button) {
button.disabled = true;
button.value = button.dataset.wait || label;
}
try {
const response = await fetch(form.action, {
method: "POST",
headers: { Accept: "application/json" },
body: new FormData(form),
});
const result = await response.json();
if (result.ok) {
form.style.display = "none";
if (fail) fail.style.display = "none";
if (done) done.style.display = "block";
return;
}
if (result.error.code === "challenge_required") {
form.submit();
return;
}
showError(
response.headers.has("Retry-After")
? `Too many messages. Try again in ${response.headers.get("Retry-After")} seconds.`
: result.error.message,
);
} catch {
form.submit();
} finally {
if (button) {
button.disabled = false;
button.value = label;
}
}
});
});
</script>form.submit()envia o formulário sem disparar o eventosubmit, então o fallback nunca volta para dentro do script.- Cole em Page settings > Custom code > Before </body> tag, ou no código de rodapé do site para todos os formulários. Código personalizado exige um plano de site pago e só roda no site publicado.
- Ele só mexe em formulários cuja action começa com
https://ikiform.com/f/, então os formulários que o Webflow ainda cuida ficam intactos.
Domínios permitidos e o limite de taxa
Em Allowed domains do formulário no Ikiform, adicione seu domínio personalizado e seu endereço de staging, como your-site.webflow.io. Nunca adicione webflow.io sozinho: todo site do Webflow bateria, inclusive os de outras pessoas. Envios de qualquer outro lugar são guardados como spam, ou recusados se você escolher Reject.
Para um formulário de contato, defina Rate limit como Strict, 2 a cada 10 minutos por visitante. Ninguém honesto escreve duas vezes em dez minutos. Um formulário de inscrição num dia de lançamento movimentado combina melhor com Relaxed, 20 por minuto por visitante. Todo formulário começa no Standard, 5 por minuto.
spam, não dispara e-mail de notificação nem webhook, não conta no seu uso e é apagado após 30 dias. Toda segunda-feira, um workspace que bloqueou spam recebe um único e-mail de resumo com o total, os formulários mais visados e os principais motivos.Confira se funciona
- Publique no seu domínio de staging
webflow.io. Custom actions só enviam a partir do site publicado. - Envie o formulário normalmente. Com a verificação humana ativa, você vê a página de verificação por um instante e depois sua página de agradecimento.
- Inspecione o formulário publicado e confirme que o contêiner do honeypot tem
aria-hiddene fica fora da tela. - Envie com o honeypot preenchido,
_gotcha=bot. Ele ainda recebe uma resposta de sucesso, mas o envio é guardado como spam e não dispara e-mail nem webhook. - Abra Submissions no painel. O novo envio está lá com todos os campos que você mandou.
- Nada chegou? Mude o filtro de status do painel para Spam. O spam recebe a mesma resposta de sucesso que um envio real.
Pegadinhas
- Spam com as opções do Webflow ligadas. Se o spam continua chegando depois de você ativar as ferramentas do Webflow, confira o Send to do formulário. Uma custom action contorna todas elas.
- reCAPTCHA esquecido no lugar. Com campos definidos no formulário do Ikiform, um
g-recaptcha-responseque sobrou falha com422 validation_failedcomo campo desconhecido. Remova o elemento. - Formulários duplicados. Copiar um formulário copia o campo honeypot, mas nem sempre os atributos personalizados dele. Confira
tabindexearia-hiddenem cada cópia. - Interactions no contêiner. Uma interaction do Webflow que anima todo Div Block do formulário pode trazer o honeypot para a vista. Exclua a classe dele.
Perguntas
Se o formulário usa uma custom action, o reCAPTCHA, o bloqueio de bots e o filtro de spam do Webflow nunca veem o envio. A proteção precisa acontecer para onde o formulário envia. Se o Webflow cuida do formulário, experimente ativar o bloqueio de bots junto com o filtro de spam.
Adicione um Div Block dentro do formulário, tire-o da tela com posicionamento absoluto e dê a ele aria-hidden true. Coloque dentro um campo chamado _gotcha com tabindex -1 e autocomplete off, e não o torne obrigatório.
Não. O Ikiform não valida tokens do reCAPTCHA. Remova o elemento e defina o Spam check do formulário no Ikiform como Ikiform, que roda o Cloudflare Turnstile sem chaves e sem código no Webflow.
Não para o honeypot nem para as verificações do Ikiform, que funcionam com o formulário simples do Webflow. Código personalizado, usado para manter o bloco de sucesso do Webflow na página, exige um plano de site pago.
Travou em algum passo ou quer um guia para o seu caso? Envie um e-mail para hello@ikiform.com.