Hushfort

Как скрыть логины пользователей в WordPress и закрыть их перебор (user enumeration)?

Автор: Eureka Studio · Обновлено

Коротко

WordPress показывает имена пользователей в четырёх публичных местах: в конечной точке REST /wp-json/wp/v2/users, в перенаправлениях ?author=1, в адресах архивов авторов и в стандартной карте сайта пользователей. Чтобы скрыть их, закройте список REST для вышедших из системы посетителей, остановите перебор ?author=, уберите карту сайта пользователей и сделайте сообщения об ошибках входа одинаковыми. Плагин может сделать все четыре; после этого проверьте каждое место.

Шаги

  1. 1Шаг 1

    Посмотрите, что WordPress показывает сейчас

    Откройте yoursite.com/wp-json/wp/v2/users, не входя в систему. На стандартной установке вы получите JSON-список, где в поле slug указан логин каждого автора.

    Публичный список пользователей REST по адресу yoursite.com/wp-json/wp/v2/users со значением slug demo-admin
  2. 2Шаг 2

    Попробуйте перебор авторов

    Теперь откройте yoursite.com/?author=1. WordPress перенаправит на /author/ваш-логин/, и имя окажется в адресной строке. Боты перебирают 1, 2, 3 и так собирают всех пользователей.

    yoursite.com/?author=1 перенаправлен на yoursite.com/author/demo-admin/ — страницу автора с заголовком Author: demo-admin
  3. 3Шаг 3

    Закройте все четыре места

    Откройте Hushfort → Укрепление поверхности и включите его. Оставьте включёнными «Список пользователей REST», «Перебор авторов» («Блокировать перебор ?author=1»), «Список авторов в карте сайта» и «Сведения об авторе в oEmbed», затем сохраните.

    Настройки укрепления поверхности: список пользователей REST закрыт для вышедших посетителей, перебор авторов заблокирован, список авторов в карте сайта и сведения об авторе в oEmbed убраны
  4. 4Шаг 4

    Проверьте ещё раз в приватном окне

    Повторите те же запросы, не входя в систему. Теперь список пользователей отвечает «rest_no_route» с кодом 404, а ?author=1 больше не перенаправляет на логин.

    Тот же адрес списка пользователей REST теперь отвечает rest_no_route с кодом 404

Почему это важно

Чтобы скрыть логины пользователей WordPress, закройте четыре публичных места, где они видны: /wp-json/wp/v2/users, перенаправления ?author=1, адреса архивов авторов и стандартную карту сайта пользователей. Заодно сделайте сообщения об ошибке входа одинаковыми и проверьте каждое место снаружи.

Чтобы войти, злоумышленнику нужны две вещи: имя пользователя и пароль. WordPress «из коробки» отдаёт первую половину. Это не ошибка: у каждого из этих мест есть своя причина (данные для приложений, красивые адреса авторов, поисковые системы). Но вместе они позволяют любому боту за секунды составить список всех логинов на вашем сайте.

Скрытие имён пользователей не делает слабый пароль безопасным. Зато оно убирает лёгкую половину головоломки: каждая попытка должна угадать и имя, и пароль. В паре с лимитами входа и двухфакторной аутентификацией подбор из медленного превращается в безнадёжный.

Четыре места, где WordPress публикует имена пользователей:

  1. REST API — /wp-json/wp/v2/users перечисляет авторов с их ярлыком (slug), который обычно совпадает с логином.
  2. Перебор авторов — /?author=1 перенаправляет на /author/login-name/.
  3. Архивы авторов — сам адрес архива содержит ярлык автора.
  4. Стандартная карта сайта — /wp-sitemap-users-1.xml перечисляет адреса архивов авторов. Ответы oEmbed тоже могут содержать сведения об авторе.

Частые ошибки

  • Закрыть одно место и считать дело сделанным. Если закрыть ?author=, а список REST оставить открытым, для бота ничего не изменится. Проверьте все четыре.
  • Отображаемое имя совпадает с логином. Даже когда все утечки закрыты, тема, которая выводит «Опубликовано: admin», выдаёт имя. Задайте другое отображаемое имя в разделе Пользователи → Профиль.
  • Сломать настоящие страницы авторов. На блоге с несколькими авторами архивы авторов полезны. Блокируйте перебор номеров, а не сами архивы.
  • Подробные ошибки входа. «Введённый вами пароль пользователя jane неверен» подтверждает, что такое имя существует. Используйте одно сообщение для обоих случаев.

Без плагина

Большую часть можно закрыть must-use плагином (wp-content/mu-plugins/hide-users.php):

<?php
// 1. REST user list: logged-out visitors get nothing.
add_filter( 'rest_endpoints', function ( $endpoints ) {
    if ( ! is_user_logged_in() ) {
        unset( $endpoints['/wp/v2/users'], $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
    }
    return $endpoints;
} );

// 2. ?author=N scans: stop the redirect that reveals the name.
add_action( 'template_redirect', function () {
    if ( isset( $_GET['author'] ) && ! is_admin() ) {
        wp_safe_redirect( home_url( '/' ), 301 );
        exit;
    }
} );

// 3. Core sitemap: drop the users provider.
add_filter( 'wp_sitemaps_add_provider', function ( $provider, $name ) {
    return 'users' === $name ? false : $provider;
}, 10, 2 );

// 4. Same message for wrong username and wrong password.
add_filter( 'login_errors', function () {
    return 'The username or password is incorrect.';
} );

Оговорки: сначала проверьте код на тестовом сайте, потому что темы и плагины иногда читают список пользователей REST. Ярлык автора в адресах архивов этот код не меняет; для этого измените nicename каждого автора или используйте плагин для отображаемых имён. И это ещё один файл, о котором нужно помнить при переносе или пересборке сайта.

Если что-то пошло не так

  • Интеграция потеряла список авторов. Некоторые внешние инструменты читают /wp/v2/users без входа. Выдайте им пароль приложения, чтобы они проходили аутентификацию, или снова откройте список.
  • Страницы авторов отдают 404. Вы выбрали полное отключение архивов авторов. Переключитесь на вариант, который блокирует только перебор номеров.
  • SEO-плагин по-прежнему перечисляет авторов. Многие SEO-плагины создают собственную карту сайта авторов. Отключите её и в этом плагине.

С Hushfort

«Защита имён пользователей» входит в Hushfort Pro — платное дополнение к Hushfort Security, бесплатному плагину безопасности для WordPress. «Сканирование поверхности», которое показывает, что ещё утекает, есть в бесплатном плагине.

Защита имён пользователей — часть уровня «Укрепление поверхности» в Hushfort — закрывает все четыре места на одном экране:

  • закрывает список REST /wp/v2/users для посетителей, не вошедших в систему,
  • блокирует перебор ?author=N, сохраняя архивы /author/name/ (или полностью отключает архивы, если вам так удобнее),
  • убирает стандартную карту сайта пользователей и сведения об авторе из ответов oEmbed,
  • делает сообщения об ошибках входа одинаковыми для неверного имени и неверного пароля.

Затем Сканирование поверхности проверяет каждое место реальными запросами и называет любое имя пользователя, которое всё ещё утекает.

Частые вопросы

Что такое перебор пользователей в WordPress?

Это сбор логинов сайта по публичным адресам, таким как ?author=1 или список пользователей REST. Зная имена, злоумышленнику остаётся только подобрать пароли.

Опасно ли, что моё имя пользователя видно?

Само по себе — нет, но это снимает половину догадок. Скрытие имён — небольшой шаг укрепления; основную работу делают надёжные пароли, лимиты входа и двухфакторная аутентификация.

Не сломает ли закрытие списка пользователей REST редактор?

Нет. На вошедших пользователей ограничение не распространяется, поэтому блочный редактор и экраны админки работают как обычно. Это важно, только если внешняя интеграция читает список пользователей без входа.

Можно ли оставить страницы архивов авторов?

Да. Можно блокировать перебор номеров ?author=, а архивы /author/имя/ продолжат работать. Чтобы полностью скрыть имена, задайте авторам отображаемое имя и ярлык, отличающиеся от логина.

Почему важны сообщения об ошибках входа?

По умолчанию WordPress сообщает, что именно неверно — имя пользователя или пароль. Это подтверждает, какие имена существуют. Одинаковое сообщение в обоих случаях убирает эту подсказку.

Сообщить об ошибке или предложить функцию

Ваше сообщение попадёт прямо к команде, которая разрабатывает Hushfort.

О чём сообщение?

Используется только для ответа вам.

Мы используем эти данные только для ответа вам. Конфиденциальность