Как автоматически отключить REST API для неавторизованных пользователей в WordPress

Диагностика проблемы: зачем ограничивать REST API в WordPress

REST API WordPress открывает доступ к данным сайта через HTTP-запросы. Однако по умолчанию API доступен для всех, включая неавторизованных пользователей, что может привести к утечке информации, повышенной нагрузке на сервер и потенциальным уязвимостям.

Если на вашем сайте нет необходимости предоставлять открытый REST API, имеет смысл ограничить доступ к нему только для авторизованных пользователей.

Пошаговое решение: отключение REST API для гостей

1. Добавьте фильтр для проверки доступа к REST API

В файл functions.php вашей темы или в плагин-«снапшот» добавьте следующий код:

add_filter('rest_authentication_errors', function($result) {
    if (!empty($result)) {
        return $result; // Уже есть ошибка аутентификации
    }
    if (!is_user_logged_in()) {
        return new WP_Error('rest_cannot_access', 'Доступ к REST API ограничен для неавторизованных пользователей.', array('status' => 401));
    }
    return $result;
});

Этот фильтр проверяет, авторизован ли пользователь, и если нет — возвращает ошибку с кодом 401 Unauthorized.

2. Исключение для определённых эндпоинтов (опционально)

Иногда нужно оставить открытыми публичные REST-эндпоинты, например, для вывода постов или страниц. Добавьте условие для проверки пути запроса:

add_filter('rest_authentication_errors', function($result) {
    if (!empty($result)) {
        return $result;
    }

    $allowed_routes = [
        '/wp/v2/posts',
        '/wp/v2/pages'
    ];
    $current_route = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';

    foreach ($allowed_routes as $route) {
        if (strpos($current_route, $route) !== false) {
            return $result; // Разрешаем доступ к этим маршрутам
        }
    }

    if (!is_user_logged_in()) {
        return new WP_Error('rest_cannot_access', 'Доступ к REST API ограничен для неавторизованных пользователей.', array('status' => 401));
    }

    return $result;
});

Проверка результата после внедрения

Чтобы убедиться, что REST API заблокирован для гостей, выполните проверку:

  1. Откройте браузер в режиме инкогнито или выйдите из аккаунта WordPress.
  2. Перейдите по адресу https://ваш-сайт.ru/wp-json/wp/v2/users — если доступ запрещён, увидите JSON с ошибкой и статусом 401.
  3. Авторизуйтесь в админке и повторите запрос — данные должны отображаться.

Для удобства можно использовать команду curl в терминале:

curl -i https://ваш-сайт.ru/wp-json/wp/v2/users

Ответ с 401 Unauthorized — значит ограничение работает.

Частые ошибки и как их исправить

  • Ошибка 403 или 500 после добавления фильтра: проверьте правильность кода, отсутствие синтаксических ошибок и корректность условий.
  • Доступ к REST API остаётся открытым: возможно, кэш на сайте или сервере не был сброшен. Очистите кэш и повторите проверку.
  • Некоторые плагины перестали работать: убедитесь, что фильтр не блокирует REST-запросы, которые нужны плагинам. Для этого добавьте исключения для их маршрутов.
  • Неправильное использование $_SERVER['REQUEST_URI']: для более точной проверки можно использовать параметр $request хука rest_authentication_errors, но он доступен только в WordPress 5.3+

Практические советы по безопасности и производительности

  • Ограничение REST API уменьшает поверхность для атак, особенно если вы не используете его в публичных целях.
  • Если на сайте много REST-вызовов от сторонних сервисов, лучше добавить исключения для их маршрутов, чтобы не нарушать работу интеграций.
  • Используйте механизмы кэширования ответа REST API, чтобы снизить нагрузку на сервер.
  • Проверяйте логи сервера на предмет частых запросов к REST API от неавторизованных пользователей — это может быть признаком сканирования или брутфорса.

Сравнение методов ограничения доступа к REST API

МетодОписаниеПлюсыМинусы
Фильтр rest_authentication_errorsОграничение доступа к REST API на уровне аутентификацииГибкий, можно разрешать отдельные маршруты, прост в реализацииМожет блокировать работу плагинов, если не настроить исключения
Отключение REST API через плагинИспользование готовых плагинов (например, Disable REST API)Простота установки, управление через админкуМеньше гибкости, лишний плагин
Ограничение на уровне сервера (.htaccess или nginx)Блокировка запросов к /wp-json/* на уровне веб-сервераВысокая производительность, не требует PHP-ресурсовМенее гибко, сложно разрешать отдельные маршруты
Удаление старых кэшей и оптимизация базы данных WordPress для ускорения сайта
25.02.2026
Использование хука WooCommerce после завершения заказа для кастомных действий
19.03.2026
Как избежать конфликтов из-за AJAX-запросов в WordPress
07.04.2026
Как добавить собственные виджеты в WordPress
24.11.2025
Как настроить автоматическое уведомление о обновлении плагинов в WordPress
25.03.2026