O WordPress é a plataforma de gerenciamento de conteúdo mais utilizada no mundo, alimentando mais de 40% de toda a web. Exatamente por essa popularidade massiva, também representa o alvo prioritário de varreduras automatizadas, redes zumbis de força bruta e campanhas de injeção de malware.
Uma instalação padrão do WordPress prioriza a facilidade de instalação e a retrocompatibilidade em detrimento da segurança restritiva. Sem um processo rigoroso de hardening em profundidade, o ambiente expõe vetores críticos: enumeração pública de usuários, execução de scripts arbitrários em diretórios de mídia, consultas recursivas no XML-RPC e configurações frouxas no servidor web.
Neste guia técnico, estruturei e documentei o Checklist Definitivo de Segurança e Hardening para WordPress, composto por 99 medidas práticas distribuídas em 11 áreas arquiteturais fundamentais.
1. Núcleo e configuração (wp-config.php)#
O arquivo wp-config.php reside no coração da aplicação. Ele orquestra credenciais de banco de dados, chaves de criptografia e parâmetros de depuração.
- Alterar as chaves de segurança (Salts) periodicamente
As chaves AUTH_KEY, SECURE_AUTH_KEY, LOGGED_IN_KEY e NONCE_KEY garantem que tokens de sessão e cookies sejam criptografados com entropia suficiente. Trocar essas chaves força o logout de todas as sessões ativas (essencial após resposta a incidentes).
// Valores de exemplo — gere os seus em https://api.wordpress.org/secret-key/1.1/salt/
define('AUTH_KEY', 'b!z8#K9*xL2m@1vPq9$J7wZ#rE4tY6uI');
define('SECURE_AUTH_KEY', 'c@3vB7$mK9#xL1wPq8*J6yZ!rE5tY4uO');
define('LOGGED_IN_KEY', 'x#9vM2*kL8@1wPq7$J5xZ#rE6tY3uP1b');
define('NONCE_KEY', 'k*7vQ4#mL9$1wPq6*J4wZ!rE7tY2uA9c');
2. Página e fluxo de autenticação (/wp-login.php)#
A interface de login é a principal porta de entrada exposta à internet. O objetivo é anular ataques de dicionário e proteger credenciais contra interceptação.
- Bloquear múltiplas tentativas incorretas de login
Implemente limitação de taxa (rate limiting) para frear tentativas automatizadas de senha.
- Impor Autenticação de Dois Fatores (2FA/MFA)
Obrigue o uso de aplicativos autenticadores (TOTP) para administradores e editores.
- Desabilitar mensagens de erro detalhadas no login
Evite que o WordPress confirme se um nome de usuário existe ou se apenas a senha está incorreta.
add_filter('login_errors', function() {
return 'Credenciais inválidas. Verifique os dados inseridos.';
});
- Configurar reCAPTCHA v3 ou Cloudflare Turnstile
Proteja o formulário contra submissões robotizadas sem friccionar o usuário legítimo.
- Alterar a URL padrão de login (
wp-login.php)
Ofuscar o endpoint padrão para um slug customizado reduz em mais de 90% o ruído de bots não direcionados.
- Forçar uso estrito de SSL/TLS na autenticação
Garante que nenhum token de autenticação trafegue em texto puro.
define('FORCE_SSL_ADMIN', true);
- Definir tempo limite restritivo de sessão (Session Timeout)
Encerre sessões ociosas automaticamente para prevenir sequestro de sessão em máquinas compartilhadas.
3. Painel administrativo (/wp-admin)#
A área administrativa exige restrições de privilégio e controle de perímetro rígido.
- Desabilitar o editor de arquivos integrado do WordPress
Previne que um atacante com credenciais administrativas altere arquivos PHP do tema ou plugin via painel.
define('DISALLOW_FILE_EDIT', true);
- Desabilitar instalação e atualização de plugins/temas pelo painel
Em ambientes de produção com CI/CD, bloqueie modificações em tempo de execução:
define('DISALLOW_FILE_MODS', true);
- Restringir acesso ao
/wp-adminpor Lista de IPs Confiáveis
Bloqueie o diretório no Nginx ou Apache liberando apenas o IP do escritório ou VPN da equipe.
- Camada de Autenticação Básica (HTTP Basic Auth) no
/wp-admin
Uma barreira antes do PHP ser invocado, economizando recursos de CPU durante ondas de ataque.
- Desativar usuário padrão
admin
Crie um nome de usuário único e não previsível para privilégios elevados.
- Aplicar Princípio do Menor Privilégio nos papéis de usuário
Nunca utilize perfil de Administrador para autores ou criadores de conteúdo que precisam apenas publicar posts.
4. Temas e camada de apresentação#
- Remover temas inativos e padrão desnecessários
Mantenha apenas o tema ativo e um tema de fallback padrão atualizado para emergências.
- Utilizar sempre Child Themes para customizações
Evita alterações diretas no código base e garante que patches de segurança do tema pai possam ser aplicados.
- Auditar chamadas a funções inseguras em templates (
eval,base64_decode)
Código ofuscado em temas de terceiros geralmente indica backdoors pré-instaladas.
- Eliminar arquivos de demonstração e dependências de debug no tema
Remova arquivos .git, composer.json, package.json e documentações expostas publicamente.
5. Práticas seguras de desenvolvimento#
- Desabilitar
WP_DEBUG_DISPLAYe manterWP_DEBUG_LOGprotegido
Erros de PHP nunca devem vazar caminhos do servidor ou dumps de consultas SQL para o navegador.
define('WP_DEBUG', true);
define('WP_DEBUG_DISPLAY', false);
define('WP_DEBUG_LOG', true);
@ini_set('display_errors', 0);
- Bloquear acesso a arquivos de ambiente e versionamento (
.env,.git)
No Nginx:
location ~ /\.(git|env|bak|config) {
deny all;
return 404;
}
- Sanitizar e validar todas as entradas com funções nativas do WordPress
Utilize sanitize_text_field(), absint(), esc_html() e esc_attr() em qualquer dado manipulado.
- Proteger requisições com Nonces (
wp_verify_nonce)
Impedir ataques de Cross-Site Request Forgery (CSRF) em ações de formulários e rotas AJAX.
- Remover scripts e bibliotecas JS em desuso
Desregistre scripts desnecessários como jQuery Migrate ou Dashicons no frontend público.
- Adotar pipeline automatizado de SAST para plugins customizados
Execute ferramentas como PHPStan, Semgrep e PHPCS com WordPress Coding Standards antes de cada deploy.
6. Gestão e auditoria de plugins#
- Instalar apenas plugins do repositório oficial ou fornecedores verificados
Evite qualquer plugin "nulled" ou pirata, vetor número um de injeção de web shells.
- Remover completamente plugins desativados
Plugins desativados ainda contêm código PHP acessível diretamente se permissões permitirem.
- Limitar o número total de plugins ativos
Menos código em execução significa menor superfície de ataque e menor latência TTFB.
- Habilitar atualizações automáticas para correções de segurança (Minor Releases)
- Auditar dependências de plugins contra bases de CVEs (WPScan / WP-Vulnerability)
- Monitorar plugins descontinuados ou removidos da WordPress.org
Se um plugin for removido do diretório oficial por questões de segurança, substitua-o imediatamente.
7. Banco de dados MySQL / MariaDB#
- Alterar o prefixo padrão das tabelas (
wp_para um valor aleatório)
Previne ataques de SQL Injection cegos que presumem nomes fixos como wp_users ou wp_posts.
$table_prefix = 'nx94_';
- Utilizar usuário de banco com privilégios mínimos necessários
Mantenha SELECT, INSERT, UPDATE, DELETE mais ALTER, CREATE e INDEX para permitir upgrades de schema sem intervenção manual. Remova privilégios destrutivos desnecessários (como DROP e GRANT OPTION) e restrinja as permissões estritamente ao banco de dados da aplicação.
- Bloquear acesso remoto ao MySQL (vincular estritamente ao
127.0.0.1ou socket Unix) - Implementar rotina de backup criptografado fora do servidor com retenção auditada
Armazene dumps em storage imutável (ex: OCI Bucket com Object Lock / S3 WORM).
8. Infraestrutura e hospedagem#
- Utilizar PHP moderno (versão 8.2 ou superior) com suporte ativo de segurança
Versões antigas do PHP (7.x) deixaram de receber patches de segurança e contêm falhas críticas conhecidas.
- Isolamento de containers e usuários no sistema de arquivos (
open_basedire chroot)
Garante que uma falha em um site não comprometa outras aplicações compartilhadas no mesmo servidor.
9. Servidor web & sistema operacional Linux#
- Configurar permissões estritas de arquivos (644 para arquivos, 755 para pastas)
find /var/www/html/ -type d -exec chmod 755 {} \;
find /var/www/html/ -type f -exec chmod 644 {} \;
chown root:www-data /var/www/html/wp-config.php && chmod 640 /var/www/html/wp-config.php
- Desabilitar a listagem de diretórios (
Options -Indexesno Apache /autoindex offno Nginx) - Ocultar assinaturas e versões do servidor (
ServerTokens Prod,expose_php = Off) - Configurar Cabeçalhos HTTP de Segurança Modernos:
Strict-Transport-Security(HSTS)X-Content-Type-Options: nosniffX-Frame-Options: SAMEORIGINReferrer-Policy: strict-origin-when-cross-originPermissions-Policyrestritiva
- Implementar WAF de borda (Cloudflare / ModSecurity / Coraza)
Mitiga injeções SQL, XSS e ataques LFI antes que o tráfego atinja o PHP-FPM.
10. Segurança ofensiva & defensiva (hardening em profundidade)#
Esta seção concentra 36 medidas essenciais para anular vetores avançados de abuso:
- Desabilitar a API REST pública para usuários não autenticados (evita vazamento de autores via
/wp-json/wp/v2/users). - Bloquear completamente o arquivo
xmlrpc.php
O XML-RPC é o principal vetor para ataques system.multicall (força bruta amplificada) e ataques de amplificação DDoS (pingback).
location = /xmlrpc.php {
deny all;
access_log off;
log_not_found off;
return 403;
}
- Bloquear execução de scripts PHP no diretório
/wp-content/uploads/
Mesmo que um invasor consiga fazer upload de uma webshell, o servidor web recusa a execução direta:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
return 403;
}
- Bloquear execução de PHP em
/wp-content/themes/e/wp-content/plugins/(para arquivos não instanciados pelo roteador principal). - Impedir acesso direto a arquivos de documentação e exemplo (
license.txt,readme.html,wp-config-sample.php). - Mover o arquivo
wp-config.phpum nível acima do webroot (o WordPress suporta isso nativamente quando nenhum outro arquivo existe no diretório pai). - Bloquear enumeração de usuários por ID via query string (
/?author=1)
if ($query_string ~* "author=([0-9]+)") {
return 403;
}
- Filtrar caracteres maliciosos e sequências de Directory Traversal em URLs (
../,eval(,base64_). - Bloquear bots maliciosos e scrapers agressivos por User-Agent e assinaturas de ASN.
- Proteger o arquivo
.htaccesse arquivos ocultos contra leitura externa. - Restringir o endpoint
/wp-admin/admin-ajax.phppara usuários não autenticados quando desnecessário. - Restringir a biblioteca de mídia para que usuários vejam apenas seus próprios uploads.
- Remover parâmetros de versão em scripts e folhas de estilo (
?ver=x.x.x) para dificultar a identificação de versões de plugins. - Desabilitar comentários sem cabeçalho
Refererlegítimo (reduzindo 98% do spam automático de comentários). - Desabilitar Easter Eggs e exposição de versão do PHP (
expose_php = Off). - Configurar monitoramento de integridade de arquivos do WordPress (File Integrity Monitoring).
- Implementar política estrita de Content Security Policy (CSP) para prevenir execução de scripts inline não autorizados.
- Registrar e centralizar logs de auditoria de eventos administrativos (criação de usuários, login, edição de opções).
11. Performance, eficiência e otimização de recursos#
Segurança e desempenho andam lado a lado: um site rápido é menos vulnerável a esgotamento de conexões e ataques de negação de serviço em camada de aplicação (HTTP Flood).
- Habilitar compressão Gzip e Brotli no servidor web
- Configurar cabeçalhos de Cache (
Cache-ControleExpires) para arquivos estáticos
location ~* \.(jpg|jpeg|png|gif|ico|webp|svg|css|js)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
}
- Utilizar HTTP/2 ou HTTP/3 (QUIC) com multiplexação de conexões
- Implementar Full Page Caching (Redis Object Cache ou Nginx FastCGI Cache)
Permite responder a milhares de requisições por segundo servindo páginas cacheadas na memória RAM, sem tocar no MySQL.
- Converter todas as imagens para formato WebP ou AVIF
- Habilitar Carregamento Sob Demanda (Native Lazy Loading) em imagens e iframes
- Desabilitar o carregamento de Emojis do WordPress no frontend
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
- Desabilitar estilos e scripts do editor de blocos (Gutenberg) se o site utiliza temas clássicos
add_action('wp_enqueue_scripts', function() {
wp_dequeue_style('wp-block-library');
wp_dequeue_style('wp-block-library-theme');
}, 100);
- Mover scripts não críticos (jQuery, jQuery Migrate) para o rodapé ou carregar com
defer - Otimizar e limpar o banco de dados periodicamente (remover revisões antigas de posts, transientes expirados e spam)
define('WP_POST_REVISIONS', 5);
- Minificar e combinar folhas de estilo CSS e arquivos JavaScript
- Distribuir conteúdo estático via Rede de Entrega de Conteúdo (CDN)
- Configurar pré-conexão DNS (
dns-prefetchepreconnect) para serviços de terceiros essenciais.
Tabela de priorização e matriz de riscos#
| Domínio Arquitetural | Itens Críticos (Alta Prioridade) | Complexidade de Implantação | Impacto em Risco |
|---|---|---|---|
| Núcleo & wp-config | Salts, isolamento e permissões | Baixa | Crítico |
| Autenticação & Login | 2FA, Rate Limit, Bloqueio de Erros | Média | Alto |
Painel /wp-admin | Desabilitar editor, Restringir IPs | Baixa | Alto |
| Banco de Dados | Prefixo, Usuário restrito, Backups | Média | Crítico |
| Hardening de Servidor | Bloqueio PHP em uploads, XML-RPC | Média | Crítico |
| Performance & Cache | Full Page Cache, WebP, Brotli | Média | Médio |
Conclusão: transformando hardening em processo contínuo#
A segurança no WordPress não é um estado estático obtido com a instalação de um plugin milagroso. Ela exige defesa em profundidade: isolamento no sistema operacional, regras preventivas no servidor web, configuração restritiva no núcleo e monitoramento contínuo de vulnerabilidades.
Aplicar essas 99 medidas transforma um ambiente padrão vulnerável em uma infraestrutura resiliente a ataques em massa, bots automatizados e agentes maliciosos.
Para auditar o seu site ponto a ponto e exportar relatórios de conformidade, utilize a ferramenta interativa WPLista:
👉 Acessar a ferramenta interativa WPLista (Checklist WordPress)
Este artigo foi útil?
Deixe uma reação rápida para apoiar o conteúdo:
Este post está licenciado sob CC BY-NC.



Comentários
Participe da discussão abaixo.
0 comentários