Risposte:
Una soluzione semplice che uso in un .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 stringa di query è /?dummy&author=5
e il modello di ricerca RewriteRule
è molto veloce: per questo spesso si vede una cattura ([0-9]*)
nelle espressioni regolari. Ma non è necessario sprecare memoria per l'acquisizione quando non si utilizza l'espressione catturata e una corrispondenza per il primo personaggio è sufficiente, perché non si desidera 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 si presentano così:
/?author={num:2}
Quindi puoi estendere la regola sopra a:
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 intuitivi di WordPress per determinare i nomi utente. Passerà in rassegna i primi 10 ID possibili per gli autori e controllerà l' Location
intestazione sulla risposta HTTP per trovare un nome utente.
Usando http://mysite.url
ad esempio ...
WPScan verificherà http://mysite.url/?author=1
. Se il tuo sito utilizza abbastanza permalink, restituirà un reindirizzamento 301 con Location
un'intestazione di http://mysite.url/author/username
. Se il tuo sito non utilizza abbastanza permalink, restituirà invece lo stato 200 (OK), quindi WPScan verificherà nel feed la stringa "post per nome utente" ed estrarrà il nome utente.
Prima di tutto, solo perché qualcuno può indovinare il tuo nome utente, non significa che il tuo sito sia insicuro. E davvero non puoi impedire a qualcuno di analizzare il tuo sito in questo modo.
Tuttavia ...
Se sei davvero preoccupato per questo, ti consiglio di fare due cose:
Un'altra alternativa è quella di cambiare il tuo autore permalink riscrive. Esistono diversi modi per farlo, e probabilmente ne troverai alcuni anche su questo sito .
Non lo ho testato a fondo, ma penso che sia preferibile rimuovere le risorse sottostanti piuttosto che provare a costruire muri attorno a esso a livello di server web. Quindi, in termini di WP, ciò impedirebbe di elaborare le variabili di query relative all'autore.
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 ucciderà del tutto gli archivi degli autori , che potrebbero essere o non essere appropriati livello di paranoia :)
È possibile utilizzare una regola di riscrittura .htaccess per impedire questa divulgazione, ma si dovrebbe anche essere sicuri di utilizzare i soprannomi per evitare di rivelare nomi utente in contenuto analizzabile come descritto da EAMann.
Il seguente blog descrive come farlo ma ha un refuso 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 continuerai a rivelare il nome utente. Dovrebbe sembrare come questo:
# Stop wordpress username enumeration vulnerability
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. Controlla:
» Blocco dell'enumerazione degli utenti di WordPress su nginx - www.edwidget.name
Come nota a margine, volevo impedire l'enumerazione dei nomi utente sul mio sito ospitato con WP Engine, che limita l'accesso degli utenti ai file di configurazione nginx di basso livello. Tuttavia, hanno una sezione "Regole di reindirizzamento" nel loro pannello di controllo che ti consente di ottenere questo risultato. Dopo qualche tempo sono riuscito a capire la migliore configurazione:
Redirect Name: // choose a description for the rewrite
Domain: // you *must* select a domain; "All Domains" will *not* work here!
Source: ^/$
Destination: /?
Quindi devi mostrare il Advanced Settings
pannello ...
Match args: author=([0-9]*)
Rewrite type: 301 Permanent
Et voilà, i tuoi nomi utente sono al sicuro [r]!
Ho completamente bloccato l'enumerazione degli utenti da WPScan aggiungendo quanto segue in 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]
La mia opinione professionale come tester di penetrazione per un'agenzia governativa ... è SEMPREvale la pena rendere più difficile enumerare le informazioni sul tuo sito web. Pochi di voi avranno un sito Web che si eleva al di sopra di google, script kiddie hacker. Stiamo parlando di sicurezza a più livelli e, con ogni livello, aggiungi tempo e complessità a un tentativo di penetrazione. Ogni livello si aggiunge anche allo skillset richiesto dall'hacker. Ci sono alcuni firewall applicativi davvero buoni disponibili su WP. Cerca quelli che possono bloccare gli indirizzi IP che hanno ripetuti tentativi di accesso dell'utente o 404. L'idea è che il tuo firewall blocchi automaticamente gli IP che scansionano il tuo sito Web alla ricerca di pagine inesistenti o tentano di accedere ripetutamente al tuo sito. Una buona funzionalità include anche funzionalità di blocco dell'iniezione XSS e SQL. Prendi in considerazione l'utilizzo di All In One WP Security da Tips and Tricks HQ, Peter, Ruhul, Ivy.
Invece del .htaccess
percorso, un'altra alternativa è quella di aggiungere il seguente codice ai temi di tuo figlio 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;
}
}
Inoltre, è possibile modificare i collegamenti predefiniti dell'autore aggiunti al nome utente di ciascuna pagina in qualcos'altro (come la homepage), utilizzando quanto segue:
# 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();
}
So che questo è un vecchio post, ma per riferimenti futuri vorrei aggiungere anche la mia soluzione. Questo è solo uno snippet da inserire nel functions.php
tuo tema. Lascia tutto al suo posto e funzionante, anche gli archivi dell'autore, ma elimina le cattive richieste di enumerazione.
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:
author=1
Se usi permalink, questo lascerà intatto l'archivio dell'autore. Inoltre, se l'URL sarà simile a /dummy?author=1
questo : questo mostrerà solo la pagina per /dummy
.
Grazie alla risposta di Rarst a questa domanda e https://perishablepress.com/stop-user-enumeration-wordpress/
Voglio pubblicare la mia visione:
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^author= [NC]
RewriteRule (.*) $1? [L]
La prima riga rileva solo la home page. Spiegherò perché. Questa funzione di "enumerazione utente" funziona solo sulla home page, quindi non è necessario riscrivere tutti gli URL.
Quindi cerchiamo la author=
stringa di query. È ovvio.
Infine, mostriamo solo la pagina originale senza blocchi, reindirizzamenti (301, 302) o divieti (403). Non dovrebbe comportarsi come una pagina con altri parametri inutili?