Как автоматически отключить 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
29.03.2026
Как автоматизировать создание и обновление sitemap в WordPress
07.04.2026
Использование Advanced Custom Fields для создания комплексных форм в WordPress
21.02.2026
Как создать и использовать кастомные таксономии в WordPress
16.03.2026
Как использовать хук WooCommerce 'woocommerce_order_status_changed' для отправки дополнительных уведомлений
21.04.2026