Ответы:
Простое решение, которое я использую в .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
например ...
WPScan проверит 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-инъекций. Подумайте об использовании All In One WP Security от Tips and Tricks 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). Разве это не должно действовать как страница с любым другим бесполезным параметром?