# Como corrigir a enumeracao de usuários no WordPress com All in One Security

User enumeration no WordPress e quando um atacante descobre os nomes de login validos do site pela REST API, pela query de autor ou pelo XML-RPC, e o All in One Security bloqueia esses três vetores em poucos cliques antes que vire forca bruta.

## O que é user enumeration no WordPress?

User enumeration no WordPress, ou enumeracao de usuários, e a técnica em que um atacante coleta os nomes de login validos do site sem precisar de senha. O WordPress, por padrão, deixa esses nomes vazarem por três caminhos: a REST API pública em /wp-json/wp/v2/users, que devolve a lista de autores em JSON; a query de autor /?author=1, que redireciona para a URL do perfil expondo o slug do usuário; e o XML-RPC, que aceita chamadas como wp.getUsersBlogs para validar logins. Com a lista de logins em maos, o atacante so precisa adivinhar a senha.

O All in One Security (AIOS), da equipe TeamUpdraft, trata a enumeracao como o primeiro elo da cadeia de um ataque de forca bruta. Por isso o plugin reune, no mesmo painel, o bloqueio da REST API de usuários, o controle do XML-RPC e a prevencao de forca bruta baseada em cookie, que esconde a própria página de login. Fechar a enumeracao reduz a superficie de ataque: sem a lista de usuários, o invasor perde o alvo e a tentativa de adivinhar senhas fica muito mais cara.

## Como identificar

- Ao acessar 'https://seusite.com/wp-json/wp/v2/users' o navegador devolve um JSON com 'id', 'name' e 'slug' de cada autor, revelando os logins.
- Abrir 'https://seusite.com/?author=1' redireciona para '/author/nomedousuario/', expondo o slug de login no endereco.
- Os relatórios do AIOS em 'Logins falhos' e '404 detection' mostram tentativas repetidas de login com os nomes de usuário reais do site.
- Scanners externos de segurança apontam o aviso 'Username enumeration is possible' ou 'User registration disclosure'.
- Picos de requisicoes em 'wp-login.php' e em 'xmlrpc.php' nos logs do servidor logo após varreduras ao endpoint de usuários.

**Antes de começar:** Antes de colar código no functions.php ou ligar a proteção de forca bruta, faça um backup completo do site (arquivos e banco) ou teste primeiro em um ambiente de staging. A URL secreta da forca bruta pode trancar você para fora do login se a 'Secret Word' for esquecida, e nesse caso a saida e desativar a opção editando o wp-config.php.

## Como prevenir

- Mantenha o All in One Security ativo com a forca bruta baseada em cookie ligada, para que a página de login nunca fique exposta a quem já conhece os nomes de usuário.
- Nunca use o login como nome de exibicao público: defina sempre um apelido distinto em cada perfil de usuário com permissão de publicar.
- Revise periodicamente os endpoints '/wp-json/wp/v2/users' e '/?author=1' em janela anonima depois de atualizar tema ou plugins, pois uma atualização pode reabrir o vazamento.
- Desative o XML-RPC sempre que nenhum aplicativo externo depender dele, eliminando um vetor de validação de login em massa.

Erros relacionados

- [Como corrigir API REST do WordPress exposta](https://full.services/wp-fixer/corrigir-api-rest-exposta-wordpress/)
- [Como proteger contra ataques de forca bruta no login](https://full.services/wp-fixer/proteger-forca-bruta-login-wordpress/)
- [Como desativar o XML-RPC com segurança](https://full.services/wp-fixer/desativar-xmlrpc-wordpress/)

## Causa

- O endpoint REST '/wp-json/wp/v2/users' esta acessivel sem autenticacao e lista todos os autores com 'slug', que e exatamente o nome usado no login.
- A query de autor '/?author=N' do WordPress redireciona para '/author/{slug}/', revelando o login de cada usuário por forca da numeracao sequencial de IDs.
- O XML-RPC ('/xmlrpc.php') esta habilitado e aceita o método 'wp.getUsersBlogs', que confirma se um par usuário e senha e valido e ainda permite amplificar tentativas por chamada.
- O nome de exibicao (display name) do usuário administrador foi deixado igual ao nome de login, entao o slug do autor entrega a credencial diretamente.
- A proteção de forca bruta do AIOS esta desativada, deixando a página 'wp-login.php' pública para que o atacante teste as senhas dos usuários já enumerados.

## Como resolver

1. Confirme que o site esta enumeravel: Antes de mexer em qualquer ajuste, comprove o vazamento abrindo os dois endpoints num navegador anonimo. Se a REST API devolver a lista de autores e a query de autor redirecionar para o slug, a enumeracao esta ativa e os passos seguintes vao fechar cada vetor.

```
https://seusite.com/wp-json/wp/v2/users
https://seusite.com/?author=1
```

2. Ative a prevencao de forca bruta no AIOS: No painel do All in One Security, ligue a proteção de forca bruta baseada em cookie. Conforme a documentação oficial, ela esconde a 'wp-login.php' atras de uma URL secreta e redireciona quem não tem o cookie, cortando o teste de senhas sobre os logins que vazaram.

```
Painel WP -> WP Security -> Firewall -> Brute Force
Marque 'Enable Brute Force Attack Prevention'
Defina uma 'Secret Word' para a URL secreta de login e salve
```

3. Bloqueie a enumeracao pela REST API e pela query de autor: Use o snippet PHP da seção de código para barrar o endpoint '/wp/v2/users' para visitantes não logados e abortar a query '?author=N'. Isso impede que a lista de autores e o slug de login sejam servidos publicamente, fechando os dois vetores principais.

```
Painel WP -> Aparencia -> Editor de Arquivos do Tema -> functions.php do tema filho
Cole o snippet da seção 'Código' ao final do arquivo
Salve e recarregue '/wp-json/wp/v2/users' para confirmar o retorno 'rest_user_cannot_view'
```

4. Desabilite o XML-RPC se não for usado: No AIOS, desligue o acesso ao XML-RPC para eliminar o método 'wp.getUsersBlogs', muito usado para validar logins e amplificar tentativas. So mantenha ativo se algum app externo (como o app oficial do WordPress ou o Jetpack) realmente depender dele.

```
Painel WP -> WP Security -> Firewall -> Basic Firewall Rules
Marque 'Completely Block Access To XMLRPC'
Clique em 'Save Basic Firewall Settings'
```

5. Separe o nome de login do nome de exibicao: Mesmo com os endpoints fechados, ajuste o perfil do administrador para que o nome público nunca seja o login. Defina o 'Apelido' e o campo 'Exibir este nome publicamente' com um valor diferente do usuário de acesso, removendo a última pista de credencial.

```
Painel WP -> Usuários -> Perfil -> campo 'Apelido (obrigatório)'
Defina o 'Apelido' diferente do nome de login
Em 'Exibir este nome publicamente', selecione o apelido e salve o perfil
```


## Código

```php
<?php
// Bloqueia a enumeracao de usuarios pela REST API e pela query de autor.

// 1) Esconde o endpoint /wp-json/wp/v2/users de visitantes nao logados.
add_filter( 'rest_endpoints', 'full_block_users_rest_endpoint' );
function full_block_users_rest_endpoint( $endpoints ) {
    if ( is_user_logged_in() ) {
        return $endpoints;
    }
    if ( isset( $endpoints['/wp/v2/users'] ) ) {
        unset( $endpoints['/wp/v2/users'] );
    }
    if ( isset( $endpoints['/wp/v2/users/(?P<id>[d]+)'] ) ) {
        unset( $endpoints['/wp/v2/users/(?P<id>[d]+)'] );
    }
    return $endpoints;
}

// 2) Aborta a query /?author=N que vaza o slug de login.
add_action( 'template_redirect', 'full_block_author_query' );
function full_block_author_query() {
    if ( is_admin() ) {
        return;
    }
    if ( ! empty( $_GET['author'] ) && is_numeric( $_GET['author'] ) ) {
        wp_safe_redirect( home_url(), 301 );
        exit;
    }
}
```

## Perguntas frequentes

### O que e user enumeration no WordPress

E a técnica em que um atacante descobre os nomes de login validos do site sem senha, consultando a REST API '/wp-json/wp/v2/users', a query '/?author=N' ou o XML-RPC. Com a lista de logins em maos, ele parte para adivinhar as senhas em um ataque de forca bruta.

### O All in One Security bloqueia a enumeracao de usuários sozinho

O AIOS reduz o risco com a prevencao de forca bruta baseada em cookie e o bloqueio do XML-RPC, ambos no painel. Para fechar o endpoint REST '/wp/v2/users' e a query de autor com certeza, complemente com o snippet PHP indicado, que barra a lista de autores para visitantes não autenticados.

### Por que a REST API mostra meus usuários

O endpoint '/wp-json/wp/v2/users' e público por padrão no WordPress e devolve os autores com 'id', 'name' e 'slug' em JSON. O 'slug' costuma ser igual ao nome de login, por isso o vazamento entrega a credencial. Restrinja o endpoint a usuários logados para corrigir.

### Desativar o XML-RPC quebra alguma coisa no site

Para a maioria dos sites não quebra nada, pois o XML-RPC e legado. Ele so e necessário para o app movel oficial do WordPress, o Jetpack e alguns serviços de publicação remota. Se você não usa esses recursos, pode bloquea-lo no AIOS com segurança.

### Bloquear '?author=1' afeta as páginas de arquivo de autor do meu blog

Sim, o snippet aborta a query numerica '?author=N', que e a usada na enumeracao. As páginas de autor por slug '/author/nome/' continuam funcionando para links internos. Se o seu tema não usa arquivos de autor, o bloqueio não gera nenhum efeito visivel.

### Como sei se meu site WordPress esta vulneravel a user enumeration

Abra em uma janela anonima os enderecos '/wp-json/wp/v2/users' e '/?author=1'. Se o primeiro retornar um JSON com a lista de autores e o segundo redirecionar para '/author/algumnome/', o site esta enumeravel e precisa das correcoes deste guia.

### A enumeracao de usuários e uma falha grave

Sozinha ela não da acesso, mas e o primeiro passo de quase todo ataque de forca bruta e de credential stuffing. Por entregar metade da credencial (o login), e classificada como severidade alta e deve ser fechada antes de qualquer endurecimento de senha.

### Preciso do AIOS Pro para bloquear a enumeracao

A versão gratuita do All in One Security já traz a prevencao de forca bruta e o bloqueio de XML-RPC usados aqui. O snippet PHP para a REST API e gratuito e independente do plugin, entao da para fechar todos os vetores sem licenca paga.

**Fonte:** [All In One Security (AIOS) - Brute force login attack prevention](https://teamupdraft.com/documentation/all-in-one-security/faqs/how-to-use-cookie-based-brute-force-login-attack-prevention-feature/)
