Odpowiedzi:
Proste rozwiązanie, którego używam w .htaccess
:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=\d
RewriteRule ^ - [L,R=403]
Jest podobny do odpowiedzi @ jptsetme, ale działa nawet wtedy, gdy ciąg zapytania jest /?dummy&author=5
, a wzorzec wyszukiwania RewriteRule
jest bardzo szybki: w tym celu często pojawia się przechwycenie ([0-9]*)
wyrażeń regularnych. Ale nie musisz marnować pamięci na przechwytywanie, gdy nie używasz przechwyconego wyrażenia, a dopasowanie pierwszego znaku jest wystarczające, ponieważ nie chcesz akceptować author=1b
.
Aktualizacja 20.04.2017
Widzę więcej „zepsutych” próśb od osób, które są nawet zbyt głupie, aby przeprowadzić prosty skan. Żądane adresy URL wyglądają następująco:
/?author={num:2}
Możesz więc rozszerzyć powyższą regułę na:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} ^author=\d+ [NC,OR]
RewriteCond %{QUERY_STRING} ^author=\{num
RewriteRule ^ - [L,R=403]
Nie możesz
Narzędzie WPScan to zautomatyzowane narzędzie, które korzysta z przyjaznych adresów URL WordPress do określania nazw użytkowników. Przeszukuje pierwszych 10 możliwych identyfikatorów autorów i sprawdza Location
nagłówek odpowiedzi HTTP, aby znaleźć nazwę użytkownika.
Używam http://mysite.url
na przykład ...
WPScan sprawdzi http://mysite.url/?author=1
. Jeśli twoja strona używa ładnych bezpośrednich linków, zwróci przekierowanie 301 z Location
nagłówkiemhttp://mysite.url/author/username
. Jeśli twoja strona nie używa ładnych bezpośrednich linków, zwróci zamiast tego stan 200 (OK), więc WPScan sprawdzi kanał w poszukiwaniu ciągu „posty według nazwy użytkownika” i wyodrębni nazwę użytkownika.
Przede wszystkim to, że ktoś może odgadnąć twoją nazwę użytkownika, nie oznacza, że twoja strona jest niepewna. I tak naprawdę nie ma sposobu, aby uniemożliwić komuś parsowanie Twojej witryny w taki sposób.
Jednak ...
Jeśli naprawdę się tym martwisz, zaleciłbym zrobienie dwóch rzeczy:
Inną alternatywą jest zmiana przepisywania przez autora linku bezpośredniego. Można to zrobić na kilka sposobów, a prawdopodobnie można znaleźć również kilka na tej stronie .
Nie przetestowałem tego dokładnie, ale myślę, że lepiej jest usunąć podstawowy zasób niż próbować budować wokół niego ściany na poziomie serwera WWW. Tak więc, w terminologii WP, to powstrzymałoby go od przetwarzania zmiennych zapytań związanych z autorami.
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 zauważa, że to całkowicie zabije archiwa autora , co może, ale nie musi być odpowiednim poziomem paranoi :)
Możesz użyć reguły przepisywania .htaccess, aby zapobiec ujawnieniu, ale powinieneś również używać pseudonimów, aby uniknąć ujawniania nazw użytkowników w parsowanej treści, jak opisano w EAMann.
Poniższy blog opisuje, jak to zrobić, ale ma literówkę w regule przepisywania: http://www.question-defense.com/2012/03/20/block-wordpress-user-enumeration-secure-wordpress-against-hacking
Prawidłowa reguła powinna również usunąć ciąg zapytania z przepisanego adresu URL, w przeciwnym razie nadal ujawnisz nazwę użytkownika. To powinno wyglądać tak:
# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yoursite.com/somepage/? [L,R=301]
Pracuje dla nas dobrze.
Chciałem dodać, że możesz to zrobić również na Nginxie. Sprawdź:
» Blokowanie wyliczania użytkowników WordPress na nginx - www.edwidget.name
Na marginesie chciałem zapobiec wyliczaniu nazw użytkowników w mojej witrynie hostowanej z WP Engine, która ogranicza dostęp użytkowników do plików konfiguracyjnych nginx niskiego poziomu. Mają jednak sekcję „Reguły przekierowania” w panelu sterowania, która pozwala to osiągnąć. Po pewnym czasie udało mi się wymyślić najlepszą konfigurację:
Redirect Name: // choose a description for the rewrite
Domain: // you *must* select a domain; "All Domains" will *not* work here!
Source: ^/$
Destination: /?
Następnie musisz pokazać Advanced Settings
panel ...
Match args: author=([0-9]*)
Rewrite type: 301 Permanent
Et voila, twoje nazwy użytkownika są bezpieczne [r]!
Całkowicie zablokowałem wyliczanie użytkowników z WPScan, dodając następujące elementy w 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]
Moja profesjonalna opinia jako testera penetracji dla rządowej agencji ... ZAWSZEwarto utrudnić wyliczenie informacji o Twojej witrynie. Niewielu z was ma stronę internetową, która wznosi się ponad google, skrypt hakerów kiddie. Mówimy o bezpieczeństwie warstwowym, a każda warstwa dodaje czasu i złożoności do próby penetracji. Każda warstwa dodaje również do zestawu umiejętności wymaganych od hakera. Na WP dostępnych jest kilka naprawdę dobrych zapór sieciowych. Poszukaj takich, które mogą blokować adresy IP, które powtórzyły próby logowania użytkownika lub 404. Chodzi o to, aby zapora sieciowa automatycznie blokowała adresy IP, które skanują witrynę w poszukiwaniu stron, które nie istnieją lub próbują wielokrotnie logować się na Twojej stronie. Dobra funkcja obejmuje także blokowanie XSS i SQL Injection. Rozważ użycie All In One WP Security od Tips and Tricks HQ, Peter, Ruhul, Ivy.
Zamiast .htaccess
trasy inną alternatywą jest dodanie następującego kodu do motywu dziecka 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;
}
}
Ponadto możesz zmienić domyślne linki autora, które są dodawane do nazwy użytkownika każdej strony, na coś innego (na przykład stronę główną), używając następujących czynności:
# 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();
}
Wiem, że to stary post, ale do przyszłych referencji chciałbym również dodać moje rozwiązanie. Jest to tylko fragment kodu, który można umieścić w functions.php
temacie. Zostawi wszystko na swoim miejscu i działa, nawet archiwa autora, ale zabija złe żądania wyliczeń.
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;
}
Co to robi:
author=1
Jeśli użyjesz permalinków, archiwa autora pozostaną taktowne. Ponadto, jeśli adres URL będzie podobny: /dummy?author=1
wyświetli się strona dla /dummy
.
Dzięki odpowiedzi Rarsta na to pytanie oraz https://perishablepress.com/stop-user-enumeration-wordpress/
Chcę opublikować własną wizję:
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^author= [NC]
RewriteRule (.*) $1? [L]
Pierwszy wiersz wykrywa tylko stronę główną. Wyjaśnię dlaczego. Ta funkcja „wyliczania użytkowników” działa tylko na stronie głównej, więc nie trzeba przepisywać wszystkich adresów URL.
Następnie szukamy author=
zapytania. To oczywiste.
Na koniec pokazujemy tylko oryginalną stronę bez bloków, przekierowań (301, 302) lub zakazów (403). Czy nie powinno to działać jak strona z jakimkolwiek innym bezużytecznym parametrem?