Aprenda a Proteger WordPress com Cloudflare WAF (Web Application Firewall) e reduzir a carga do seu servidor.
O WordPress possui muitas falhas conhecidas e devido ao uso de plugins em exagero é essencial proteger a instalação com um WAF.
O Cloudflare oferece esse serviço 100% gratuito e a vantagem é que ao ser bloqueado no WAF do cloudflare o request nem chega no seu servidor, então também ajuda no desempenho.
Proteção WAF para WordPress
Essas regras são específicas para quem utiliza wordpress, com alguns adicionais como filtro de visitas do Brasil.
(not http.host contains "exemplo.com.br")
or (http.request.uri.path contains "/wp-login.php")
or (http.request.uri.path contains "/wp-admin/" and http.request.uri.path ne "/wp-admin/admin-ajax.php")
or (http.request.uri.path contains "upload/" and not http.request.uri.path contains "/wp-content/")
or (http.request.uri.path contains "upload/" and not http.request.uri.path contains "/wp-includes/")
or ((http.request.uri.path contains ".php" and not http.request.full_uri contains "/wp-admin/")
or (http.request.uri.path contains "/wp-content/" and not http.referer contains "exemplo.com.br")
or (http.request.uri.path "/wp-includes/" and not http.referer contains "exemplo.com.br")
or (http.request.uri.path contains "/wp-content/" and http.request.uri.path contains ".php")
or (http.request.method eq "OPTIONS" and not http.request.uri.path contains "/wp-content/")
or (http.request.uri.path contains "/.")
or (http.request.method eq "POST" and http.referer ne "exemplo.com.br")
or (http.request.uri.path contains "/wp-admin/admin-ajax.php" and http.request.method eq "POST" and not http.referer contains "exemplo.com.br")
or (http.request.uri.path contains "/wp-comments-post.php" and http.request.method eq "POST" and not http.referer contains "exemplo.com.br")
or (http.request.uri.path in {"/wp-admin" "/wp-admin/"} and not http.cookie contains "wordpress_logged")
or (http.request.uri contains "wp-config.")
or (http.request.uri contains "setup-config.")
or (http.request.uri.path contains "/xmlrpc.php" and http.request.method eq "POST")
or (http.request.uri.query contains "author_name=")
or (http.request.uri.query contains "author=" and not http.request.uri.path contains "/wp-admin/export.php")
or (http.request.uri contains "/wp-json/wp/v2/users/")
or (http.request.uri.path contains "wp-" and http.request.uri.path in {".zip" ".asp" ".sql" ".gz" ".bak" ".tar"})
or (http.request.uri.path contains "/wp-admin/install.php")
Para aplicar, utilize o código abaixo:
(not http.host contains "siterapidowp.com.br") or (http.request.uri.path contains "/wp-login.php") or (http.request.uri.path contains "/wp-admin/" and http.request.uri.path ne "/wp-admin/admin-ajax.php") or (http.request.uri.path contains "upload/" and not http.request.uri.path contains "/wp-content/") or (http.request.uri.path contains "upload/" and not http.request.uri.path contains "/wp-includes/") or (http.request.uri.path contains ".php" and not http.request.full_uri contains "/wp-admin/") or (http.request.uri.path contains "/wp-content/" and not http.referer contains "siterapidowp.com.br") or (http.request.uri.path contains "/wp-includes/" and not http.referer contains "siterapidowp.com.br") or (http.request.uri.path contains "/wp-content/" and http.request.uri.path contains ".php") or (http.request.method eq "OPTIONS" and not http.request.uri.path contains "/wp-content/") or (http.request.uri.path contains "/.") or (http.request.method eq "POST" and http.referer ne "siterapidowp.com.br") or (http.request.uri.path contains "/wp-admin/admin-ajax.php" and http.request.method eq "POST" and not http.referer contains "siterapidowp.com.br") or (http.request.uri.path contains "/wp-comments-post.php" and http.request.method eq "POST" and not http.referer contains "siterapidowp.com.br") or (http.request.uri.path in {"/wp-admin" "/wp-admin/"} and not http.cookie contains "wordpress_logged") or (http.request.uri.path in {"/readme.html" "/wlwmanifest.xml" "license.txt"}) or (http.request.uri contains "wp-config.") or (http.request.uri contains "setup-config.") or (http.request.uri.path contains "/xmlrpc.php" and http.request.method eq "POST") or (http.request.uri.query contains "author_name=") or (http.request.uri.query contains "author=" and not http.request.uri.path contains "/wp-admin/export.php") or (http.request.uri contains "/wp-json/wp/v2/users/") or (http.request.uri.path contains "wp-" and http.request.uri.path in {".zip" ".asp" ".sql" ".bak" ".tar" ".log" ".rar" ".xz"}) or (http.request.uri.path contains "/wp-admin/install.php")Lembre de substituir o URL exemplo.com.br por seu URL, para facilitar isso eu fiz uma planilha no google docs, para utilizar ela faça uma cópia.
Proteção WAF para qualquer site
Principalmente proteção contra BOTS, requisições que não sejam GET, HEAD e POST, URL de referência sem vazio…
(http.request.method in {"PUT" "PATCH" "DELETE"})
or (not http.request.method in {"GET" "HEAD" "POST"})
or (http.request.method eq "OPTIONS" and not http.request.uri.path contains "/wp-content/")
or (http.referer ne "" and not http.referer contains "http://" and not http.referer contains "https://" and not cf.client.bot)
or (http.request.uri.path contains "phpmyadmin")
or (http.request.uri.path contains "/cpanel")
or (http.request.uri.path contains "/install.php")
or (http.request.uri.path contains "/.htaccess")
or (not http.user_agent contains "Mozilla/5.0 (")
Para aplicar, utilize o código abaixo:
(http.request.method in {"PUT" "DELETE" "PATCH"}) or (not http.request.method in {"GET" "HEAD" "POST"}) or (http.referer ne "" and not http.referer contains "http://" and not http.referer contains "https://" and not cf.client.bot) or (http.request.uri.path contains "phpmyadmin") or (http.request.uri.path contains "/cpanel") or (http.request.uri.path contains "/install.php") or (http.request.uri.path contains "/.htaccess") or (not http.user_agent contains "Mozilla/5.0 (")Regras de Rate Limiting
Essas regras limitam o acesso às áreas problemáticas do wordpress, em geral APIs e a busca, ajuste conforme o uso, coloquei 6 requests por cada 10 segundos e ficou bom.
or (http.request.uri.path contains "/?s=")
or (http.request.uri.path contains "/admin-ajax.php")
or (http.request.uri.path contains "/wp-json" and not http.request.uri.path contains "/wp-json/redirection/")
or (http.request.uri.path contains "/xmlrpc.php")
or (http.request.uri.path contains "/wp-login.php")
or (http.request.uri.path contains "?rest_route=/")
or (http.request.uri.path contains "/wp-cron.php")
Para aplicar, utilize o código abaixo:
(http.request.uri.path contains "/?s=") or (http.request.uri.path contains "/admin-ajax.php") or (http.request.uri.path contains "/wp-json" and not http.request.uri.path contains "/wp-json/redirection/") or (http.request.uri.path contains "/xmlrpc.php") or (http.request.uri.path contains "/?rest_route=/") or (http.request.uri.path contains "/wp-login.php") or (http.request.uri.path contains "/wp-cron.php")Atualizado para permitir que o plugin redirection funcione corretamente alterando a regra:
or (http.request.uri.path contains “/wp-json”)
para
or (http.request.uri.path contains “/wp-json” and not http.request.uri.path contains “/wp-json/redirection/”)
Regras de BOTS conhecidos
(cf.client.bot) or (http.request.uri.path in {"/robots.txt" "/ads.txt" "/sitemap.xml" "/sitemap_index.xml" "/post-sitemap.xml"})
Ordens das regras
A ordem das regras é importante, pois as primeiras regras são processadas antes e pode ser que nem chegue a regra que permite se outra regras já bloqueio ela anteriormente.
Por isso a primeira regra é aceitar os bots conhecidos:

Vou atualizar esse post sempre que aparecer uma nova vulnerabilidade que pode ser mitigada através de regras do WAF.
É importante lembrar que pode ser que algum plugin específico pode ficar bloqueado em uma dessas regras e impedir o funcionamento correto, nesse caso olhe a área de log do Cloudflare.
Tenho um site que não atualizou as regras no Cloudflare, sabe como resolver?
Seguindo suas dicas, muito obrigado!
Olá, tudo bem?
Antes de mais nada, parabéns pelo post e muito obrigado pela sua contribuição, pois me ajudou demais! Estava tendo problemas com ataques de bots e as configurações resolveram o problema.
Gostaria apenas de tirar uma dúvida: na configuração para todos os sites, a ação recomendada é a mesma para WordPress, ou seja, Desafio Gerenciado?
Mais uma vez agradeço e ficarei na expectativa.
Forte abraço
Sim, utilize Desafio Gerenciado também