Come Impedire l'Enumerazione degli Username?
È possibile impedire l'enumerazione degli username sul mio sito WordPress? Al momento riesco a vedere gli utenti utilizzando lo strumento WPScan.

Una soluzione semplice che utilizzo in un file .htaccess
:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=\d
RewriteRule ^ - [L,R=403]
È simile alla risposta di @jptsetme, ma funziona anche quando la query string è /?dummy&author=5
, e il modello di ricerca per RewriteRule
è molto veloce: spesso si vede una cattura ([0-9]*)
nelle espressioni regolari per questo. Ma non c'è bisogno di sprecare memoria per la cattura quando non si utilizza l'espressione catturata, e una corrispondenza per il primo carattere è sufficiente, perché non si vuole accettare author=1b
.
Aggiornamento 20.04.2017
Sto vedendo più richieste "rotte" da parte di persone che sono persino troppo stupide per eseguire una semplice scansione. Gli URL richiesti appaiono così:
/?author={num:2}
Quindi potresti estendere la regola sopra con:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} ^author=\d+ [NC,OR]
RewriteCond %{QUERY_STRING} ^author=\{num
RewriteRule ^ - [L,R=403]

Non puoi.
Lo strumento WPScan è un'utilità automatizzata che sfrutta gli URL amichevoli di WordPress per determinare i nomi utente. Esegue un ciclo tra i primi 10 ID possibili per gli autori e controlla l'intestazione Location
nella risposta HTTP per trovare un nome utente.
Utilizzando ad esempio http://miosito.url
...
WPScan verificherà http://miosito.url/?author=1
. Se il tuo sito utilizza i permalink ottimizzati, restituirà un reindirizzamento 301 con un'intestazione Location
di http://miosito.url/author/nomeutente
. Se il tuo sito non utilizza i permalink ottimizzati, restituirà invece uno stato 200 (OK), quindi WPScan controllerà il feed alla ricerca della stringa "articoli di nomeutente" ed estrarrà il nome utente.
Cosa puoi fare
Innanzitutto, il fatto che qualcuno possa indovinare il tuo nome utente non significa che il tuo sito sia insicuro. E non c'è davvero alcun modo per impedire a qualcuno di analizzare il tuo sito in questo modo.
Tuttavia ...
Se sei veramente preoccupato per questo, consiglierei di fare due cose:
- Disattiva i permalink ottimizzati. Questo costringerà WPScan e strumenti simili a analizzare il contenuto del tuo sito per i nomi utente anziché affidarsi all'URL.
- Obbliga gli utenti a impostare un nickname diverso. In assenza di un nome utente nell'URL, gli strumenti di scansione cercheranno "articoli di nomeutente" nel feed/contenuto del post. Se non pubblichi i nomi utente, non potranno essere catturati.
Un'altra alternativa è modificare le regole di riscrittura dei permalink degli autori. Ci sono diversi modi per farlo, e probabilmente puoi trovare alcuni anche su questo sito.

Non ho testato approfonditamente questa soluzione, ma penso sia preferibile rimuovere la risorsa sottostante piuttosto che cercare di costruire barriere attorno ad essa a livello di server web. Quindi in termini WordPress, significherebbe impedire l'elaborazione delle variabili di query relative agli autori.
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;
}
);
}
PS: nota che questo eliminerà completamente gli archivi degli autori, il che potrebbe essere o meno un livello di paranoia appropriato :)

Puoi utilizzare una regola di riscrittura .htaccess per prevenire questa divulgazione, ma dovresti anche assicurarti di utilizzare soprannomi per evitare di rivelare i nomi utente in contenuti analizzabili come descritto da EAMann.
Il seguente blog descrive come farlo ma contiene un errore di battitura nella regola di riscrittura: http://www.question-defense.com/2012/03/20/block-wordpress-user-enumeration-secure-wordpress-against-hacking
La regola corretta dovrebbe anche rimuovere la stringa di query dall'URL riscritto, altrimenti il nome utente verrà comunque rivelato. Dovrebbe essere così:
# Blocca la vulnerabilità di enumerazione degli utenti in WordPress
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yoursite.com/somepage/? [L,R=301]
Funziona bene per noi.

Volevo aggiungere che puoi farlo anche su nginx. Dai un'occhiata:
» Bloccare l'enumerazione degli utenti in WordPress su nginx - www.edwidget.name
Come nota a margine, volevo prevenire l'enumerazione degli username sul mio sito ospitato con WP Engine, che limita l'accesso degli utenti ai file di configurazione di basso livello di nginx. Tuttavia, hanno una sezione "Regole di reindirizzamento" nel loro pannello di controllo che ti permette di ottenere questo risultato. Dopo un po' di tempo sono riuscito a trovare la configurazione migliore:
Nome del reindirizzamento: // scegli una descrizione per la riscrittura
Dominio: // *devi* selezionare un dominio; "Tutti i domini" *non* funzionerà qui!
Sorgente: ^/$
Destinazione: /?
Poi devi mostrare il pannello Impostazioni avanzate
...
Argomenti da abbinare: author=([0-9]*)
Tipo di riscrittura: 301 Permanente
Et voilà, i tuoi username sono più al sicuro!

Ho completamente bloccato l'enumerazione degli utenti da WPScan aggiungendo quanto segue in htaccess
# Blocca la vulnerabilità di enumerazione username in WordPress
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://tuodominio.com [L,R=301]
RewriteCond %{QUERY_STRING} author=d
RewriteRule ^ /? [L,R=301]
La mia opinione professionale come penetration tester per un'agenzia governativa... è SEMPRE utile rendere più difficile l'enumerazione delle informazioni sul tuo sito web. Pochi di voi avranno un sito che attirerà l'attenzione di hacker esperti come Google o script kiddie. Stiamo parlando di sicurezza a strati e con ogni strato, aggiungi tempo e complessità a un tentativo di penetrazione. Ogni strato aumenta anche le competenze richieste all'hacker. Ci sono alcuni firewall per applicazioni davvero validi disponibili per WP. Cerca quelli che possono bloccare gli indirizzi IP che hanno tentativi ripetuti di login utente o 404. L'idea è che il tuo firewall blocchi automaticamente gli IP che scansionano il tuo sito alla ricerca di pagine inesistenti o tentano ripetutamente di accedere al tuo sito. Una buona funzionalità include anche capacità di blocco per XSS e SQL Injection. Considera l'uso di All In One WP Security di Tips and Tricks HQ, Peter, Ruhul, Ivy. Ha un'interfaccia decente e un set di funzionalità adatto sia ai principianti che agli esperti.

Invece della soluzione con .htaccess
, un'alternativa è aggiungere il seguente codice al file functions.php
del tuo child theme:
# Reindirizza la pagina autore alla homepage
add_action( 'template_redirect', 'wpse_46469_author_page' );
function wpse_46469_author_page() {
# Se si sta accedendo alla pagina archivio autore, reindirizza alla homepage
if ( is_author() ) {
wp_safe_redirect( get_home_url(), 301 );
exit;
}
}
Inoltre, puoi modificare i link autore predefiniti che vengono aggiunti al nome utente in ogni pagina sostituendoli con altro (come la homepage), utilizzando il seguente codice:
# Sostituisce l'URL autore con la homepage
add_filter( 'author_link', 'wpse_46469_author_link' );
function wpse_46469_author_link() {
# Restituisce l'URL della homepage
return home_url();
}

So che questo è un vecchio post, ma per future referenze vorrei aggiungere anche la mia soluzione. Questo è solo uno snippet da inserire nel file functions.php
del tuo tema. Lascerà tutto al suo posto e funzionante, anche gli archivi degli autori, ma eliminerà le richieste di enumerazione indesiderate.
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;
}
Cosa fa:
- analizza l'URL cercando qualcosa come:
author=1
- Quando trovato, rimuoverà la variabile author dalle query vars così non verrà interrogata.
Se usi i permalink, questo lascerà intatti gli archivi degli autori. Inoltre, se l'URL sarà qualcosa come: /dummy?author=1
questo mostrerà semplicemente la pagina per /dummy
.
Grazie alla risposta di Rarst a questa domanda e a https://perishablepress.com/stop-user-enumeration-wordpress/

Voglio condividere la mia visione:
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} author=(\%|\+|\d) [NC]
RewriteRule (.*) $1? [L]
La prima riga rileva solo la homepage. Spiego il perché. Questa funzionalità di "user-enumeration" funziona solo sulla homepage, quindi non c'è bisogno di riscrivere tutti gli URL.
Poi cerchiamo la stringa di query author=
. Questo è ovvio.
Infine, mostriamo semplicemente la pagina originale senza alcun blocco, reindirizzamenti (301, 302) o ban (403). Non dovrebbe comportarsi come una pagina con qualsiasi altro parametro inutile?
