Respostas:
Uma solução simples que eu uso em um .htaccess
:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=\d
RewriteRule ^ - [L,R=403]
É semelhante à resposta de @ jptsetme, mas funciona mesmo quando a string de consulta é /?dummy&author=5
e o padrão de pesquisa RewriteRule
é muito rápido: Você geralmente vê uma captura ([0-9]*)
em expressões regulares para isso. Mas não há necessidade de desperdiçar memória para a captura quando você não usa a expressão capturada, e uma correspondência para o primeiro caractere é suficiente, porque você não deseja aceitar author=1b
.
Atualização 20.04.2017
Estou vendo mais solicitações "quebradas" de pessoas que são estúpidas demais para executar uma varredura simples. Os URLs solicitados são assim:
/?author={num:2}
Então você pode estender a regra acima para:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} ^author=\d+ [NC,OR]
RewriteCond %{QUERY_STRING} ^author=\{num
RewriteRule ^ - [L,R=403]
Você não pode.
A ferramenta WPScan é um utilitário automatizado que tira proveito dos URLs amigáveis do WordPress para determinar os nomes de usuários. Ele percorrerá os 10 primeiros IDs possíveis para autores e verificará o Location
cabeçalho na resposta HTTP para encontrar um nome de usuário.
Usando http://mysite.url
por exemplo ...
O WPScan irá verificar http://mysite.url/?author=1
. Se seu site estiver usando links permanentes, retornará um redirecionamento 301 com um Location
cabeçalho de http://mysite.url/author/username
. Se seu site não estiver usando links permanentes, retornará um status de 200 (OK), portanto o WPScan verificará o feed da string "posts by username" e extrairá o nome de usuário.
Primeiro de tudo, apenas porque alguém pode adivinhar seu nome de usuário, não significa que seu site seja inseguro. E não há realmente nenhuma maneira de impedir alguém de analisar seu site dessa maneira.
Contudo ...
Se você está realmente preocupado com isso, eu recomendaria fazer duas coisas:
Outra alternativa é alterar as reescritas do seu autor. Existem várias maneiras de fazer isso, e você provavelmente também pode encontrar algumas neste site .
Não testei isso completamente, mas acho que é preferível remover o recurso subjacente em vez de tentar criar muros em torno dele no nível do servidor da web. Portanto, nos termos do WP, isso impediria o processamento de variáveis de consulta relacionadas ao autor.
if ( ! is_admin() ) {
add_filter(
'query_vars',
function ( $public_query_vars ) {
foreach ( array( 'author', 'author_name' ) as $var ) {
$key = array_search( $var, $public_query_vars );
if ( false !== $key ) {
unset( $public_query_vars[$key] );
}
}
return $public_query_vars;
}
);
}
O PS nota que isso matará completamente os arquivos do autor , o que pode ou não ser o nível de paranóia apropriado :)
Você pode usar uma regra de reescrita .htaccess para impedir essa divulgação, mas também deve usar apelidos para evitar a divulgação de nomes de usuários no conteúdo analisável, conforme descrito pelo EAMann.
O blog a seguir descreve como fazer isso, mas possui um erro de digitação na regra de reescrita: http://www.question-defense.com/2012/03/20/block-wordpress-user-enumeration-secure-wordpress-against-hacking
A regra correta também deve remover a string de consulta do URL reescrito, ou você ainda divulgará o nome de usuário. Deve ficar assim:
# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yoursite.com/somepage/? [L,R=301]
Trabalhando bem para nós.
Eu queria acrescentar que você também pode fazer isso no nginx. Verifique:
» Bloqueando a enumeração de usuários do WordPress no nginx - www.edwidget.name
Como uma observação lateral, eu queria impedir a enumeração de nome de usuário no meu site hospedado com o WP Engine, que limita o acesso dos usuários a arquivos de configuração de nginx de baixo nível. No entanto, eles têm uma seção "Regras de redirecionamento" em seu painel de controle, que permite fazer isso. Depois de algum tempo, consegui descobrir a melhor configuração:
Redirect Name: // choose a description for the rewrite
Domain: // you *must* select a domain; "All Domains" will *not* work here!
Source: ^/$
Destination: /?
Então você precisa mostrar o Advanced Settings
painel ...
Match args: author=([0-9]*)
Rewrite type: 301 Permanent
Et voila, seus nomes de usuário estão seguros [r]!
Eu bloqueei completamente a enumeração de usuários do WPScan adicionando o seguinte no htaccess
# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yourdomain.com [L,R=301]
RewriteCond %{QUERY_STRING} author=d
RewriteRule ^ /? [L,R=301]
Minha opinião profissional como testador de penetração para uma agência governamental ... é SEMPREvale a pena dificultar a enumeração de informações sobre seu site. Poucos de vocês terão um site que se eleva acima do google, hackers de script infantil. Estamos falando de segurança em camadas e, com cada camada, você adiciona tempo e complexidade a uma tentativa de penetração. Cada camada também aumenta o conjunto de habilidades exigidas pelo hacker. Existem alguns firewalls de aplicativos realmente bons disponíveis no WP. Procure aqueles que podem bloquear endereços IP que tenham repetido tentativas de login de usuário ou 404. A idéia é que seu firewall bloqueie automaticamente IPs que varrem seu site em busca de páginas que não existem ou tentam entrar repetidamente em seu site. Um bom recurso também inclui recursos de bloqueio de XSS e SQL Injection. Considere usar o All In One WP Security de Dicas e Truques HQ, Peter, Ruhul, Ivy.
Em vez da .htaccess
rota, outra alternativa é adicionar o seguinte código aos temas do seu filho functions.php
:
# Redirect author page to homepage
add_action( 'template_redirect', 'wpse_46469_author_page' );
function wpse_46469_author_page() {
# If the author archive page is being accessed, redirect to homepage
if ( is_author() ) {
wp_safe_redirect( get_home_url(), 301 );
exit;
}
}
Além disso, você pode alterar os links de autor padrão adicionados ao nome de usuário de cada página para outra coisa (como a página inicial), usando o seguinte:
# Replace author URL with the homepage
add_filter( 'author_link', 'wpse_46469_author_link' );
function wpse_46469_author_link() {
# Return homepage URL
return home_url();
}
Sei que este é um post antigo, mas para futuras referências também gostaria de adicionar minha solução. Este é apenas um trecho para inserir no functions.php
seu tema. Ele deixará tudo no lugar e funcionando, até o arquivo do autor, mas elimina os pedidos de enumeração incorretos.
if (!is_admin()) {
if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING']) ) {
add_filter( 'query_vars', 'iside_remove_author_from_query_vars' );
}
add_filter('redirect_canonical', 'iside_remove_author_from_redirects', 10, 2);
}
function iside_remove_author_from_redirects($redirect, $request) {
if( !is_admin() && preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING']) ) {
add_filter( 'query_vars', 'iside_remove_author_from_query_vars' );
}
return $redirect;
}
function iside_remove_author_from_query_vars( $query_vars ) {
if( !is_admin() ) {
foreach( array( 'author', 'author_name' ) as $var ) {
$key = array_search( $var, $query_vars );
if ( false !== $key ) {
unset( $query_vars[$key] );
}
}
}
return $query_vars;
}
O que faz:
author=1
Se você usar permalinks, isso deixará os arquivos do autor intactos. Além disso, se o URL for algo como: /dummy?author=1
isso mostrará apenas a página /dummy
.
Graças à resposta da Rarst a esta pergunta e https://perishablepress.com/stop-user-enumeration-wordpress/
Quero postar minha própria visão:
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^author= [NC]
RewriteRule (.*) $1? [L]
A primeira linha detecta apenas a página inicial. Eu vou explicar o porquê. Esse recurso de "enumeração do usuário" funciona apenas na página inicial, portanto, não é necessário reescrever todos os URLs.
Em seguida, procuramos a author=
string de consulta. É obvio.
Por fim, apenas mostramos a página original sem nenhum bloco, redirecionamento (301, 302) ou proibição (403). Não deveria agir como uma página com outro parâmetro inútil?