REST API — мощный инструмент WordPress, позволяющий работать с сайтом через HTTP-запросы. Однако бывают ситуации, когда нужно ограничить к нему доступ для определённых групп пользователей, например, для гостей или ролей с низкими правами. В этой статье подробно разберём, как именно отключить REST API WordPress для выбранных пользователей, рассмотрим примеры кода и советы по безопасности.
Что такое REST API в WordPress и зачем его отключать для некоторых пользователей
REST API предоставляет внешний интерфейс для получения и изменения данных сайта. Многие плагины и темы используют его для динамического обновления контента, интеграций и мобильных приложений.
Но открытый доступ к REST API может стать уязвимостью — злоумышленники могут пытаться получить конфиденциальные данные или перегрузить сайт. Поэтому часто требуется ограничить доступ к REST API, например:
- отключить для неавторизованных пользователей (гостей);
- запретить доступ ролям, не имеющим определённых прав;
- ограничить отдельные эндпоинты API.
Это поможет повысить безопасность и снизить нагрузку на сервер.
Отключаем REST API для неавторизованных пользователей
Самый простой и популярный способ — блокировать REST API для гостей. Для этого добавим в functions.php темы или в отдельный плагин следующий код:
function wp8_disable_rest_api_for_guests($access) {
if (!is_user_logged_in()) {
return new WP_Error('rest_forbidden', __('Доступ к REST API ограничен'), array('status' => 401));
}
return $access;
}
add_filter('rest_authentication_errors', 'wp8_disable_rest_api_for_guests');Этот фильтр проверяет, авторизован ли пользователь. Если нет — возвращает ошибку с кодом 401. Таким образом, REST API становится недоступен для гостей, но все залогиненные пользователи по-прежнему могут его использовать.
Пояснения и возможные доработки
Этот метод прост и часто подходит. Но если на сайте используются публичные эндпоинты, например для получения информации о товарах, их стоит исключить из блокировки. Для этого можно проверить URL запроса и выборочно разрешать доступ.
Отключение REST API для определённых ролей пользователей
Иногда нужно разрешить доступ только администраторам и редакторам, а для остальных ролей — запретить. Для этого изменим функцию:
function wp8_disable_rest_api_for_roles($access) {
if (!is_user_logged_in()) {
return new WP_Error('rest_forbidden', __('Доступ к REST API ограничен'), array('status' => 401));
}
$user = wp_get_current_user();
$allowed_roles = array('administrator', 'editor');
if (array_intersect($allowed_roles, $user->roles)) {
return $access; // разрешаем
}
return new WP_Error('rest_forbidden', __('Доступ к REST API ограничен для вашей роли'), array('status' => 403));
}
add_filter('rest_authentication_errors', 'wp8_disable_rest_api_for_roles');Здесь мы проверяем роли текущего пользователя и разрешаем доступ только указанным. Остальным — выдаём ошибку 403 Forbidden.
Как узнать роли пользователя и расширить список
Для просмотра ролей используйте функцию wp_get_current_user() и выведите их через print_r() или в отладчике. Добавляйте нужные роли в массив $allowed_roles.
Отключение REST API для определённых эндпоинтов
Иногда нужно закрыть не весь REST API, а только отдельные маршруты. Например, запретить доступ к эндпоинтам пользователей или комментариев.
Для этого можно использовать фильтр rest_endpoints, чтобы удалять нежелательные маршруты.
function wp8_restrict_rest_endpoints($endpoints) {
// Удаляем эндпоинты пользователей
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
}
// Удаляем эндпоинты комментариев
if (isset($endpoints['/wp/v2/comments'])) {
unset($endpoints['/wp/v2/comments']);
}
return $endpoints;
}
add_filter('rest_endpoints', 'wp8_restrict_rest_endpoints');Этот код удаляет маршруты пользователей и комментариев из REST API, делая их недоступными для всех.
Как проверить, какие эндпоинты есть на сайте
Чтобы увидеть все REST маршруты, откройте в браузере https://ваш-сайт.ru/wp-json/. Там будет список всех доступных эндпоинтов. По ним можно ориентироваться для удаления.
Использование плагинов для управления доступом к REST API
Если хотите упростить работу, есть готовые плагины, например:
- Clearfy Pro — в ней есть удобные настройки для блокировки REST API по ролям и другим критериям;
- WPCommunity — если вы строите социальную сеть, плагин позволяет гибко настраивать доступ к API;
- WPRemark — с точки зрения отзывов, можно ограничить доступ к REST API для анонимных комментаторов.
Плагины подходят, если не хотите писать код или нужна расширенная настройка с UI.
Советы по безопасности и тестированию после ограничений REST API
После внесения изменений обязательно протестируйте работу сайта и интеграций. Некоторые темы и плагины используют REST API для динамических функций, и их работа может быть нарушена.
Для отладки используйте инструменты браузера (вкладка Network) и плагины отладки REST API, например REST API Console.
Также рекомендуется вести логи ошибок, чтобы фиксировать проблемы с доступом.
Выводы
Отключение REST API для определённых пользователей — важная задача для повышения безопасности и оптимизации работы сайта. Варианты решения:
- блокировка для гостей через фильтр
rest_authentication_errors; - ограничение по ролям с проверкой текущего пользователя;
- удаление отдельных эндпоинтов через
rest_endpoints; - использование готовых плагинов (Clearfy Pro, WPCommunity и др.) для гибкой настройки.
Применяйте подход, максимально подходящий под ваш проект, и не забывайте тестировать функциональность после изменений.