WP Manifestindependent plugin directory
manifest / security / botzero

BotZero - Anti-Spam for Contact Form 7

Anti-spam for Contact Form 7: five invisible layers that block bots without captchas or external services

by in9ti · github.com/joaocorrea081/botzero

★ 0stars
0forks

Install

No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:

wp plugin install https://github.com/joaocorrea081/botzero/archive/refs/heads/main.zip

BotZero — Anti-Spam para Contact Form 7

Bloqueia bots de spam no Contact Form 7 com cinco camadas invisíveis. Sem captcha, sem serviço externo, sem nada pro seu visitante resolver.

O problema que ele resolve

A maior parte do spam que chega no Contact Form 7 não é escrita por gente — e não parece spam. Chega com nome plausível, e-mail válido, empresa que parece real e uma frase inofensiva, tudo gerado por uma biblioteca como o Faker. Filtros de conteúdo como o Akismet classificam como legítimo porque, por tudo que eles conseguem medir, aquilo é legítimo.

O que denuncia o bot não é o conteúdo. É a entrega: ele nunca abre a sua página. Manda um POST direto no endpoint do formulário (/wp-json/contact-form-7/v1/contact-forms/<id>/feedback) com uma lista de campos guardada.

O BotZero parte exatamente disso. Cada camada faz uma pergunta que só um navegador de verdade, com uma pessoa de verdade, consegue responder.

As cinco camadas

Camada O que ela pergunta O que ela pega
Token JS de uso único Esse envio veio de uma página que foi realmente carregada? Bots que mandam POST direto no endpoint. O token é buscado por JavaScript depois que a página carrega e nunca pode ser usado duas vezes.
Interação humana Alguém moveu, tocou, digitou ou rolou? Navegadores headless, que executam JavaScript mas nunca tocam na página.
Honeypot Você preencheu um campo que nenhum humano enxerga? Bots que leem o HTML e preenchem todo campo que encontram.
Checagem de origem Isso foi enviado a partir deste site? Envios vindos de outro site. Requisições sem nenhum Origin/Referer continuam aceitas, porque proxies e ferramentas de privacidade removem esses cabeçalhos legitimamente.
Tempo mínimo + limite por IP Isso era humanamente possível? Envios instantâneos e rajadas vindas de um mesmo endereço.

Um envio bloqueado passa pelo próprio mecanismo wpcf7_spam do Contact Form 7: nenhum e-mail é enviado e plugins de banco de dados não gravam nada. O Akismet continua funcionando junto — os dois resolvem problemas diferentes e não conflitam.

Configurações

Em Configurações → BotZero você vê quantos bots foram bloqueados nos últimos 30 dias, separados por camada que barrou. Dá pra saber de relance se está funcionando e que tipo de bot está chegando. Cada camada tem seu próprio liga/desliga, e o tempo mínimo de preenchimento e o limite por IP são ajustáveis.

Pra um log detalhado, adicione no wp-config.php:

define( 'BOTZERO_DEBUG', true );

Cada bloqueio passa a ser gravado no wp-content/debug.log com o motivo (no-token, no-interaction, honeypot, too-fast, token-reused, origin, rate-limit).

Instalação

Baixe o zip e vá em Plugins → Adicionar novo → Enviar plugin → Ativar. Não há nada pra configurar: todo formulário do Contact Form 7 fica protegido na hora.

Requer WordPress 6.0+, PHP 7.4+ e Contact Form 7.

Um detalhe que você precisa saber

Visitante com JavaScript desativado é bloqueado. O próprio Contact Form 7 já depende de JavaScript pra enviar sem recarregar a página, então na prática isso é raro — mas é uma consequência real, não hipotética. Se isso pesar pro seu público, desligue a camada de token e use as outras quatro.

Plugin de cache não é problema: o token é buscado depois que a página carrega, então nunca fica gravado no HTML em cache.


English

Most Contact Form 7 spam is not written by a person, and does not look like spam. It arrives with a plausible name, a valid email address, a real-looking company and a harmless sentence — generated by a library like Faker. Content-based filters such as Akismet score it as legitimate because, by every measure they can see, it is legitimate.

What gives the bot away is not the content, it is the delivery: it never opens your page. It POSTs straight to the form endpoint.

BotZero is built around that. Five invisible layers — single-use JS token, human interaction signal, honeypot, origin check, timing and per-IP rate limit — each asking a question only a real browser driven by a real person can answer. Blocked submissions go through Contact Form 7's own wpcf7_spam pipeline, so no mail is sent and database add-ons store nothing.

Settings → BotZero shows 30-day block counters broken down by layer, with a switch for each protection and tunable thresholds. Native pt-BR translation included.

Trade-off: visitors with JavaScript disabled are blocked. Contact Form 7 already needs JavaScript to submit without a page reload, so this is rare in practice — but it is real. If it matters for your audience, turn the token layer off and rely on the other four.


Licença

GPL v2 ou posterior. Feito pela in9ti.