Como corrigir API REST do WordPress exposta
O que é a API REST exposta no WordPress?
A API REST do WordPress é a interface em /wp-json/ que o editor de blocos, plugins e apps usam para ler e gravar dados. O problema de segurança não é a API existir, e sim ela expor informação sensível sem autenticação. A rota /wp-json/wp/v2/users lista os nomes de usuário (logins) de quem já publicou no site, e /wp-json/wp/v2/ revela quais plugins registram endpoints. Com os logins em mãos, o atacante só precisa quebrar a senha por força bruta. A correção certa é restringir as rotas que vazam dados, mantendo o resto da REST API funcionando, e não bloquear tudo, o que quebraria o editor e vários plugins.
Como identificar
- Abrir “seudominio.com/wp-json/wp/v2/users” no navegador retorna um JSON com os nomes de usuário do site.
- O scanner de segurança aponta “User Enumeration via REST API” ou “REST API users endpoint exposed”.
- No log, requisições repetidas a /wp-json/wp/v2/users coincidem com picos de tentativas de login.
- A rota “/wp-json/” lista publicamente todos os namespaces de plugins instalados no site.
Como prevenir
- Mantenha a rota /wp/v2/users restrita a usuários autenticados e bloqueie /?author=N para anônimos
- Declare permission_callback em todo endpoint REST customizado de plugins próprios
- Use um WAF que limite requisições anônimas às rotas sensíveis e detecte enumeração de usuários
Causa
- A rota /wp/v2/users da REST API lista nomes de usuário publicamente por padrão, sem exigir autenticação.
- Enumeração de usuários também possível por /?author=1, que redireciona e revela o slug do login.
- Endpoints de plugins mal escritos que retornam dados sensíveis sem checar permissão (permission_callback).
- A rota índice /wp-json/ expõe todos os namespaces, mapeando os plugins instalados para o atacante.
- Falta de um WAF ou regra que limite o acesso anônimo às rotas que vazam informação.
Como resolver
- Confirme a exposição: abra seudominio.com/wp-json/wp/v2/users no navegador. Se retornar a lista de usuários em JSON, a enumeração via REST está aberta e precisa ser restringida.
- Restrinja a rota de usuários por código: no functions.php do tema-filho ou em um plugin de snippets, filtre o endpoint /users para exigir autenticação, devolvendo erro a quem não estiver logado.
- Bloqueie a enumeração por author: barre o acesso a /?author=N para visitantes anônimos, evitando que o slug do login vaze pela URL do autor.
- Revise os endpoints dos seus plugins: garanta que todo endpoint customizado declare um permission_callback. Endpoint sem checagem de permissão é o vetor mais comum de vazamento de dados pela REST.
- Adicione uma camada de WAF: configure o firewall/WAF para limitar requisições anônimas às rotas sensíveis da REST API e bloquear padrões de enumeração de usuários.
// Exige autenticacao na rota /wp/v2/users e bloqueia enumeracao por author
// (functions.php do tema-filho ou plugin de snippets)
add_filter( 'rest_endpoints', function ( $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;
} );
// Bloqueia a enumeracao classica por /?author=N para visitantes anonimos
add_action( 'template_redirect', function () {
if ( ! is_user_logged_in() && isset( $_GET['author'] ) ) {
wp_safe_redirect( home_url(), 301 );
exit;
}
} );














