Відповіді:
Просте рішення, яке я використовую в .htaccess
:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=\d
RewriteRule ^ - [L,R=403]
Це схоже на відповідь @ jptsetme, але він працює навіть тоді, коли рядок запитів є /?dummy&author=5
, а шаблон пошуку RewriteRule
дуже швидкий: ви часто бачите захоплення ([0-9]*)
в регулярних виразах для цього. Але не потрібно витрачати пам'ять на захоплення, коли ви не використовуєте захоплений вираз, і збігу для першого символу достатньо, тому що ви не хочете приймати author=1b
.
Оновлення 20.04.2017
Я бачу більше "зламаних" запитів від людей, які навіть занадто дурні, щоб виконати просте сканування. Запитані URL-адреси виглядають приблизно так:
/?author={num:2}
Таким чином, ви можете розширити правило вище:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} ^author=\d+ [NC,OR]
RewriteCond %{QUERY_STRING} ^author=\{num
RewriteRule ^ - [L,R=403]
Ви не можете.
Інструмент WPScan - це автоматизована утиліта, яка використовує переваги зручних URL-адрес WordPress для визначення імен користувачів. Він перегляне перші 10 можливих ідентифікаторів для авторів і перевірить Location
заголовок HTTP-відповіді, щоб знайти ім'я користувача.
Використовуючи, http://mysite.url
наприклад, ...
WPSможе перевірити http://mysite.url/?author=1
. Якщо ваш сайт використовує досить постійні посилання, він поверне переспрямування 301 із Location
заголовком http://mysite.url/author/username
. Якщо ваш сайт не використовує досить постійних посилань, він натомість поверне статус 200 (ОК), тож WPScan перевірить канал на рядок "Публікації за ім'ям користувача" та вилучить ім'я користувача.
Перш за все, те, що хтось може здогадатися про ваше ім’я користувача, не означає, що ваш сайт небезпечний. І справді немає способу завадити комусь розібратися на вашому веб-сайті таким чином.
Однак ...
Якщо ви справді переймаєтесь цим, я рекомендую зробити дві речі:
Ще одна альтернатива - це зміна вашого автора постійна посилання на переписування. Ви можете це зробити декількома способами, і їх, мабуть, можна знайти і на цьому сайті .
Це не перевірено ретельно, але я думаю, що краще видалити базовий ресурс, а не намагатися будувати стіни навколо нього на рівні веб-сервера. Отже, в умовах WP, що зупиняє його на обробці змінних запитів, пов’язаних з автором.
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 Зверніть увагу , що це буде вбивати автор архіви повністю , що може або не може бути відповідним рівнем параної :)
Ви можете використовувати правило перезапису .htaccess для запобігання цього розкриття, але ви також не забудьте використовувати псевдоніми, щоб уникнути розкриття імен користувачів у вмісті, що проаналізується, як описано в EAMann.
Наступний блог описує, як це зробити, але має помилку в правилі переписати: http://www.question-defense.com/2012/03/20/block-wordpress-user-enumeration-secure-wordpress-against-hacking
Правильне правило також повинне видалити рядок запиту із переписаної URL-адреси, інакше ви все одно розкриєте ім'я користувача. Це повинно виглядати так:
# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yoursite.com/somepage/? [L,R=301]
Добре працює для нас.
Я хотів додати, що ви можете це робити і на nginx. Перевірте:
» Блокування переліку користувачів WordPress на nginx - www.edwidget.name
В якості бічної примітки, я хотів запобігти перерахуванню імені користувача на своєму веб-сайті, розміщеному з WP Engine, що обмежує доступ користувачів до конфігураційних файлів nginx низького рівня. Однак у їх панелі керування є розділ "Правила перенаправлення", який дозволяє вам це зробити. Через деякий час мені вдалося визначити найкращу конфігурацію:
Redirect Name: // choose a description for the rewrite
Domain: // you *must* select a domain; "All Domains" will *not* work here!
Source: ^/$
Destination: /?
Тоді вам потрібно показати Advanced Settings
панель ...
Match args: author=([0-9]*)
Rewrite type: 301 Permanent
Et voila, ваші імена користувачів безпечні [r]!
Я повністю заблокував перерахування користувачів з WPScan, додавши в 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]
Моя професійна думка, як тестер на проникнення урядового агентства ... Це ВЖЕварто ускладнити перерахування інформації про ваш веб-сайт. Мало хто з вас матиме веб-сайт, який піднімається вище google, скриптів, хакерських дітей. Ми говоримо про багатошарову безпеку і з кожним шаром ви додаєте час і складність спробі проникнення. Кожен шар також додає до набору навичок, необхідних для хакера. На WP є кілька дійсно хороших брандмауерів додатків. Шукайте тих, хто може заблокувати IP-адреси, які повторюють спроби входу користувачів або 404. Ідея полягає в тому, щоб ваш брандмауер автоматично блокував IP-адреси, які сканують ваш веб-сайт, на сторінки, які не існують, або намагаються повторно входити на ваш сайт. Хороша особливість також включає можливості блокування XSS та SQL Injection. Подумайте про використання безпеки в одному WP від підказів HQ, Peter, Ruhul, Ivy.
Замість .htaccess
маршруту ще одна альтернатива - додати наступний код до дочірньої теми 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;
}
}
Крім того, ви можете змінити авторські посилання за замовчуванням, які додаються до імені користувача кожної сторінки на щось інше (наприклад, на домашню сторінку), використовуючи наступне:
# 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();
}
Я знаю, що це старий пост, але для майбутніх посилань я також хотів би додати своє рішення. Це лише фрагмент functions.php
вашої теми. Це залишить усе на місці і працює, навіть авторський архів, але це вбиває погані запити перерахування.
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;
}
Що це робить:
author=1
Якщо ви використовуєте постійні посилання, це залишить авторські архіви в такті. Крім того, якщо URL буде чимось на зразок: /dummy?author=1
це просто відобразить сторінку для /dummy
.
Завдяки відповіді Rarst на це питання та https://perishablepress.com/stop-user-enumeration-wordpress/
Я хочу розмістити своє власне бачення:
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^author= [NC]
RewriteRule (.*) $1? [L]
Перший рядок виявляє лише домашню сторінку. Я поясню, чому. Ця функція "перерахування користувача" працює лише на домашній сторінці, тому не потрібно переписувати всі URL-адреси.
Далі шукаємо author=
рядок запиту. Це очевидно.
Нарешті, ми просто показуємо оригінальну сторінку без будь-яких блоків, переадресацій (301, 302) або заборон (403). Чи не повинен він діяти як сторінка з будь-яким іншим марним параметром?