Segurança WordPress

Regras de firewall na Cloudflare que eu uso no WordPress

WAF na Cloudflare: wp-login e wp-admin fora do Brasil, contato e xmlrpc, pontuação de ameaça, Managed Challenge. No meu site, 98% da visita nem chega na origem.

Assistir ao vídeo original no YouTube
Thumbnail do vídeo: Criando Regras de Firewall no Cloudflare para o Wordpress

Eu não vou vender o WAF como muralha mágica. Vou mostrar as regras que eu já tinha no painel, o que cada uma dispara, e o número na tela: dezenas de bots falhando o desafio, duas pessoas passando. Segurança → WAF. Conta gratuita, naquela época, aguentava umas três a cinco regras. Dá para fazer um conjunto curto que segura wp-login, xmlrpc, contato e IP com cara de spam.

Crie regra no WAF da Cloudflare, não no plugin. A minha primeira: URL contém wp-login e o país não é Brasil — ou a pontuação de ameaça do IP é 49 — ação Managed Challenge, não o Legacy Captcha. Outras: páginas de contato/contact e xmlrpc.php; wp-admin e wp-login fora do Brasil com JS Challenge; pontuação maior que 24 com JS Challenge. Isso não pega bot do Google. Combine com cache na borda: no meu caso, 98% das visitas nem batiam no servidor.

Onde
Cloudflare → Segurança → WAF
Ação
Managed Challenge ou JS Challenge, não bloqueio cego
Efeito colateral
Visitante resolve no navegador; bot cai

Onde clicar, e por que eu não bloqueio — eu desafio

Domínio na Cloudflare. Segurança, WAF, criar regra. Nome, expressão, ação. Eu não cliquei em criar na gravação. Mostrei as que já estavam no ar. Ação que eu usava no começo: Legacy Captcha. A própria interface já marcava Legacy. Coisa velha. O caminho novo é Managed Challenge, o desafio gerenciado. Eu ainda não tinha comparado os dois a fundo. Tratei o gerenciado como a versão atual do captcha em JavaScript. Troquei.

Desafio não é bloqueio. Pessoa de verdade, o navegador resolve. Bot, na conta que eu mostrei, não resolve. Uma regra: duas passagens, 86 falhas. Outra: 60 pessoas passaram no JS Challenge de pontuação. Visitante comum não percebe guerra. Quem bate em wp-login o dia inteiro percebe.

wp-login, país e a pontuação 49

Regra que eu ensino primeiro: se a URL contém wp-login, e o país não é o Brasil, dispara. Eu administro de cá. Login vindo de outro país, neste site, não é eu. Dá para afrouxar se a equipe viaja. Dá para apertar se só você entra, sempre do mesmo lugar. Segunda condição na mesma regra: pontuação do IP — o threat score antigo da Cloudflare, 0 a 100, quanto maior pior — igual a 49. Na fala eu comparei com “um S”. É o score de ameaça, não o Bot Score novo (esse vai de 1 a 99 ao contrário: baixo é bot). Atenção em 2026: a documentação da Cloudflare diz que cf.threat_score agora é sempre zero. Se você copiar a regra da gravação à letra, o ramo do score nunca dispara. Troque esse ramo por Bot Score baixo, ou fique só no país e na URL.

Ação: Managed Challenge. Você pode ter uma regra só de país e outra só de score. Eu juntei. Conta grátis tem pouca regra. Juntar expressão é o jeito de não estourar o teto de três a cinco.

Contato, xmlrpc.php, wp-admin: o desafio na frente do spam e do brute force

Segunda regra: página de contato. URL com contato, ou contact — o site é multilíngue — e não é wp-content. Eu não lembrava, na hora, o motivo exato do “não wp-content”. Deve ter sido imagem ou arquivo estático na mesma árvore que eu não queria desafiar. Entrou também o arquivo xmlrpc.php. Quem já levou brute force por xmlrpc sabe. Ação: Managed Challenge de novo. A pessoa chega no formulário, o navegador resolve, o bot de comentário e de xmlrpc não preenche nada.

Terceira: wp-admin e wp-login, de novo, se não for Brasil, JS Challenge. Todo mundo que entra no painel de fora passa pelo JavaScript. Bot não entra. Eu ainda apontei uma regra de bot com pontuação maior que 24 e JS Challenge. Sessenta passaram. O visitante com IP limpo não entra nessa conta. Não é para ter medo de desafiar score alto. É para ter medo de Bloquear país inteiro sem olhar o log.

Googlebot, na minha experiência com essas regras, não aparece chorando no Search Console. A Cloudflare já trata rastreio conhecido. Mesmo assim: depois de ligar, abra a cobertura de índice. Se uma URL de contato sumir, a expressão está larga.

  1. Abra o domínio na Cloudflare → Segurança → WAF → criar regra.
  2. wp-login: URL contém wp-login E país ≠ Brasil, OU threat score no patamar que você escolher (eu usei 49). Ação: Managed Challenge.
  3. Formulário: URL contém /contato ou /contact, e não contém wp-content; OU URL contém xmlrpc.php. Ação: Managed Challenge.
  4. Painel: URL contém wp-admin ou wp-login E país ≠ Brasil. Ação: JS Challenge.
  5. Score: threat score maior que 24. Ação: JS Challenge. Olhe o gráfico da regra antes de apertar mais.
  6. Não use Bloquear nessas quatro, a menos que o log mostre abuso puro. Desafio primeiro.

Jetpack, Page Shield, e os 98% que nem chegam no PHP

Firewall na borda não substitui senha, atualização, plugin podre. Eu ainda usava Jetpack, principalmente pelo CDN de imagem. Recomendação da gravação, não religião. No mesmo menu de segurança tem Bot Fight, bloqueio de proxy, Page Shield, um monte de chave que eu falei que não conhecia o bastante para explicar uma a uma. Vale passear. Não vale ligar tudo no escuro.

A parte que as pessoas subestimam: cache. O meu site, na prática, estava estático na Cloudflare. 98% das visitas cacheadas. 9800 daquela fatia não bateram na origem. Um milhão de requisições, 58 mil visitas únicas, arquivo, página, tudo servido na borda. Firewall em cima de origem exposta é um jogo. Firewall em cima de site que o visitante quase não toca no PHP é outro. HTML cacheado, WAF no login e no xmlrpc, desafio no contato. Independente de o servidor “já ter firewall”. A Cloudflare está na frente. Use a frente.

  • Conta grátis: poucas regras. Junte expressão em vez de criar uma regra por capricho.
  • Managed Challenge no lugar de Legacy Captcha.
  • País ≠ Brasil no wp-login e no wp-admin, neste site. Ajuste se a equipe não é daqui.
  • Threat score antigo: número alto era ruim — e hoje o campo veio zero. Bot Score novo: número baixo é ruim.
  • Cache na borda reduz o que o WAF precisa defender. 98% cacheado, no meu painel.

Na sequência

  1. Anote de quais países a equipe realmente entra no wp-admin antes de copiar a regra “não é Brasil”.
  2. Troque Legacy Captcha por Managed Challenge se a regra ainda estiver no modo antigo.
  3. Confira se xmlrpc.php precisa existir. Se não precisa, desafiar é o mínimo; desligar o xmlrpc no WordPress é melhor.
  4. Depois de publicar, olhe o gráfico da regra: passagens versus falhas. 86 a 2, no meu caso, era o recado.
  5. Abra o Search Console se a regra incluir URL pública (contato). Login pode desafiar à vontade.
  6. Meça o percentual de cache na Cloudflare. WAF sem cache ainda deixa o PHP na linha de frente.

Onde isso quebra

Bloquear país em vez de desafiar, e cortar o leitor que viaja ou a CDN de imagem.

Usar Bot Score (1–99, baixo = bot) com o número do threat score antigo.

Desafiar wp-content e quebrar CSS, JS e imagem.

Achar que cinco regras no WAF substituem update de plugin e senha.

Copiar xmlrpc na regra e esquecer que o app de celular do WordPress usa xmlrpc, se você usa esse app.

Ligar Super Bot Fight e Page Shield no mesmo dia das quatro regras e não saber o que quebrou o formulário.

Perguntas frequentes

Isso pega o Google?

Nas regras que eu mostrei, não vi problema de rastreio. Desafio em login e xmlrpc não é página de artigo. Contato é a que merece olho no Search Console depois de ligar.

Quantas regras a conta grátis deixa?

Na gravação eu falei de três a cinco. O número muda com o plano. Trate como recurso curto: uma expressão rica vale mais que cinco regras de um if só.

Managed Challenge ou JS Challenge?

Eu estava saindo do Legacy Captcha para o Managed Challenge. JS Challenge eu deixei em wp-admin e em score. Bloquear eu não usei nesse conjunto. Pessoa passa, bot não.

Preciso de plugin de firewall no WordPress?

O WAF da Cloudflare age antes do PHP. Plugin no WordPress age depois, quando o request já chegou. Eu usei Jetpack por causa da imagem, não como substituto dessas regras.

E se eu não for do Brasil?

Troque o país. A lógica é: o painel só é desafiado quando o request não parece a equipe. País é o atalho que eu usei. IP da escritório, se você tiver estável, é outro atalho.

A camada na borda conversa com proteger WordPress contra cópia e abuso e com proteger site na Cloudflare.