Pot preveni enumerarea numelor de utilizatori în WordPress?
Pot preveni enumerarea numelor de utilizatori pe site-ul meu WordPress? În prezent pot vedea utilizatorii folosind instrumentul WPScan.

O soluție simplă pe care o folosesc în .htaccess
:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=\d
RewriteRule ^ - [L,R=403]
Este similară cu răspunsul lui @jptsetme, dar funcționează chiar și atunci când șirul de interogare este /?dummy&author=5
, iar modelul de căutare pentru RewriteRule
este foarte rapid: Adesea vezi o captură ([0-9]*)
în expresiile regulate pentru aceasta. Dar nu este nevoie să irosești memorie pentru captură atunci când nu folosești expresia capturată, iar o potrivire pentru primul caracter este suficientă, deoarece nu vrei să accepți author=1b
.
Actualizare 20.04.2017
Văd tot mai multe cereri "defecte" de la oameni care nici măcar nu sunt capabili să ruleze un simplu scan. URL-urile solicitate arată astfel:
/?author={num:2}
Așadar, ai putea extinde regula de mai sus la:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} ^author=\d+ [NC,OR]
RewriteCond %{QUERY_STRING} ^author=\{num
RewriteRule ^ - [L,R=403]

Nu poți.
Instrumentul WPScan este o unealtă automatizată care profită de URL-urile prietenoase ale WordPress pentru a determina numele de utilizator. Acesta va parcurge primele 10 ID-uri posibile pentru autori și va verifica antetul Location
din răspunsul HTTP pentru a găsi un nume de utilizator.
Folosind http://mysite.url
ca exemplu...
WPScan va verifica http://mysite.url/?author=1
. Dacă site-ul tău folosește permalink-uri frumoase, acesta va returna o redirecționare 301 cu un antet Location
de tipul http://mysite.url/author/username
. Dacă site-ul tău nu folosește permalink-uri frumoase, va returna un status 200 (OK), așa că WPScan va verifica feed-ul pentru șirul "postări de către username" și va extrage numele de utilizator.
Ce poți face
În primul rând, faptul că cineva poate ghici numele tău de utilizator nu înseamnă că site-ul tău este nesigur. Și nu există nicio modalitate prin care să poți preveni pe cineva să analizeze site-ul tău în acest fel.
Totuși...
Dacă ești cu adevărat îngrijorat de acest lucru, aș recomanda să faci două lucruri:
- Dezactivează permalink-urile frumoase. Acest lucru va forța WPScan și alte instrumente similare să analizeze conținutul site-ului tău pentru nume de utilizator, în loc să se bazeze pe URL.
- Forțează utilizatorii să seteze un alt pseudonim. În absența unui nume de utilizator în URL, instrumentele de scanare vor căuta "postări de către username" în feed-ul/conținutul postărilor. Dacă nu afișezi nume de utilizator, atunci acestea nu pot fi obținute.
O altă alternativă este să modifici rescrierile permalink-urilor pentru autori. Există mai multe modalități prin care poți face acest lucru și probabil că poți găsi câteva pe acest site de asemenea.

Nu am testat acest lucru în detaliu, dar cred că este preferabil să eliminăm resursele subiacente decât să încercăm să construim ziduri în jurul lor la nivel de server web. Deci, în termeni de WordPress, asta ar însemna să oprim procesarea variabilelor de interogare legate de 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;
}
);
}
PS: rețineți că acest lucru va elimina complet arhivele autorilor, ceea ce poate sau nu poate fi un nivel adecvat de paranoia :)

Puteți folosi o regulă de rescriere .htaccess pentru a preveni această expunere, dar ar trebui să vă asigurați și că utilizați porecle pentru a evita dezvăluirea numelor de utilizator în conținut analizabil, așa cum este descris de EAMann.
Următorul blog descrie cum să faceți acest lucru, dar conține o greșeală de tipar în regula de rescriere: http://www.question-defense.com/2012/03/20/block-wordpress-user-enumeration-secure-wordpress-against-hacking
Regula corectă ar trebui să elimine și șirul de interogare din URL-ul rescris, altfel veți expune în continuare numele de utilizator. Ar trebui să arate astfel:
# Opriți vulnerabilitatea de enumerare a numelor de utilizator WordPress
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yoursite.com/somepage/? [L,R=301]
Funcționează bine pentru noi.

Am vrut să adaug că poți face asta și pe nginx. Verifică:
» Blocarea Enumerării Utilizatorilor WordPress pe nginx - www.edwidget.name
Ca o observație suplimentară, am vrut să împiedic enumerarea numelor de utilizator pe site-ul meu găzduit cu WP Engine, care limitează accesul utilizatorilor la fișierele de configurare de nivel scăzut ale nginx. Cu toate acestea, ei au o secțiune "Reguli de Redirecționare" în panoul de control care vă permite să realizați acest lucru. După ceva timp, am reușit să găsesc cea mai bună configurație:
Nume Redirecționare: // alegeți o descriere pentru rescriere
Domeniu: // *trebuie* să selectați un domeniu; "Toate Domeniile" *nu* va funcționa aici!
Sursă: ^/$
Destinație: /?
Apoi trebuie să afișați panoul Setări Avansate
...
Potrivire argumente: author=([0-9]*)
Tip Rescriere: 301 Permanentă
Și voila, numele de utilizator sunt mai în siguranță!

Am blocat complet enumerarea utilizatorilor de către WPScan prin adăugarea următoarelor reguli în 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]
Opinia mea profesională ca tester de penetrare pentru o agenție guvernamentală... este ÎNTOTDEAUNA valabil să faci mai dificilă enumerarea informațiilor despre site-ul tău. Puțini dintre voi veți avea un site care depășește nivelul hackerilor de tip script kiddie sau Google. Vorbim despre securitate stratificată, unde fiecare strat adaugă timp și complexitate unei încercări de penetrare. Fiecare strat mărește și setul de abilități necesare hackerului. Există câteva firewall-uri de aplicație foarte bune disponibile pentru WordPress. Căutați cele care pot bloca adresele IP care au încercări repetate de autentificare sau generează erori 404. Ideea este ca firewall-ul vostru să blocheze automat IP-urile care scanează site-ul pentru pagini inexistente sau încearcă să se conecteze în mod repetat. O caracteristică bună include și capabilități de blocare a XSS și SQL Injection. Luați în considerare utilizarea plugin-ului All In One WP Security de la Tips and Tricks HQ, Peter, Ruhul, Ivy. Are o interfață decentă și un set de funcționalități potrivite atât pentru începători, cât și pentru experți.

În loc de ruta .htaccess
, o altă alternativă este să adăugați următorul cod în functions.php
al temei child:
# Redirecționează pagina autorului către pagina principală
add_action( 'template_redirect', 'wpse_46469_author_page' );
function wpse_46469_author_page() {
# Dacă se accesează pagina de arhivă a autorului, redirecționează către pagina principală
if ( is_author() ) {
wp_safe_redirect( get_home_url(), 301 );
exit;
}
}
În plus, puteți modifica link-urile implicite ale autorului care sunt adăugate la numele de utilizator al fiecărei pagini în altceva (cum ar fi pagina principală), folosind următoarele:
# Înlocuiește URL-ul autorului cu pagina principală
add_filter( 'author_link', 'wpse_46469_author_link' );
function wpse_46469_author_link() {
# Returnează URL-ul paginii principale
return home_url();
}

Știu că acesta este un post vechi, dar pentru referințe viitoare, aș dori să adaug și soluția mea. Acesta este doar un fragment de cod de introdus în fișierul functions.php
al temei dumneavoastră. Va lăsa totul la locul lui și funcțional, inclusiv arhivele autorilor, dar va elimina cererile nedorite de enumerare.
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;
}
Ce face:
- scanează URL-ul pentru ceva de genul:
author=1
- Când este găsit, va elimina variabila autor din variabilele de interogare, astfel încât să nu fie utilizată în interogare.
Dacă utilizați permalink-uri, acest cod va păstra arhivele autorilor intacte. De asemenea, dacă URL-ul va fi ceva de genul: /dummy?author=1
, acesta va afișa doar pagina pentru /dummy
.
Mulțumiri răspunsului lui Rarst la această întrebare și https://perishablepress.com/stop-user-enumeration-wordpress/

Vreau să îmi expun propria viziune:
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} author=(\%|\+|\d) [NC]
RewriteRule (.*) $1? [L]
Prima linie detectează doar pagina de start. Voi explica de ce. Această funcționalitate de "enumerare a utilizatorilor" funcționează doar pe pagina principală, deci nu este nevoie să rescriem toate URL-urile.
Apoi căutăm șirul de interogare author=
. Este evident.
În final, afișăm doar pagina originală fără blocări, redirecționări (301, 302) sau interdicții (403). Nu ar trebui să se comporte ca o pagină cu orice alt parametru inutil?
