Posso impedir a enumeração de nomes de usuário?


Respostas:


26

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=5e 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]

13

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 Locationcabeçalho na resposta HTTP para encontrar um nome de usuário.

Usando http://mysite.urlpor exemplo ...

O WPScan irá verificar http://mysite.url/?author=1. Se seu site estiver usando links permanentes, retornará um redirecionamento 301 com um Locationcabeç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.

O que você pode fazer

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:

  1. Desativar links permanentes. Isso forçará o WPScan e ferramentas semelhantes a analisar o conteúdo do seu site em nomes de usuário, em vez de confiar no URL.
  2. Força os usuários a definir um apelido diferente. Na ausência de um nome de usuário no URL, as ferramentas de verificação procurarão "postagens por nome de usuário" no conteúdo do feed / postagem. Se você não está colocando nomes de usuários por aí, eles não podem ser presos.

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 .


4

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 :)


3

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.


2

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 Settingspainel ...

Match args: author=([0-9]*)
Rewrite type: 301 Permanent

Et voila, seus nomes de usuário estão seguros [r]!


0

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.


0

Em vez da .htaccessrota, 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();
}

0

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.phpseu 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:

  • verifica o URL em busca de algo como: author=1
  • Quando encontrada, ela remove a variável de autor dos vars de consulta, para que não seja consultada.

Se você usar permalinks, isso deixará os arquivos do autor intactos. Além disso, se o URL for algo como: /dummy?author=1isso mostrará apenas a página /dummy.

Graças à resposta da Rarst a esta pergunta e https://perishablepress.com/stop-user-enumeration-wordpress/


0

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?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.