Как в WordPress REST API отключить определенные эндпоинты (например, доступ к списку пользователей по ID) для повышения безопасности сайта?
WordPress REST API — мощный инструмент, но открытые эндпоинты могут стать уязвимостью. Особенно опасен эндпоинт `/wp-json/wp/v2/users`, который раскрывает логины и ID всех зарегистрированных пользователей. Рассмотрим несколько способов ограничить доступ к нежелательным маршрутам.
## 1. Отключение конкретных эндпоинтов через хук `rest_endpoints`
Самый гибкий способ — использовать фильтр `rest_endpoints` в файле `functions.php` вашей темы или в плагине:
php
add_filter( ‘rest_endpoints’, function( $endpoints ) {
// Отключаем доступ к списку пользователей
if ( isset( $endpoints[‘/wp/v2/users’] ) ) {
unset( $endpoints[‘/wp/v2/users’] );
}
if ( isset( $endpoints[‘/wp/v2/users/(?P[d]+)’] ) ) {
unset( $endpoints[‘/wp/v2/users/(?P[d]+)’] );
}
return $endpoints;
});
Этот код полностью удаляет маршруты пользователей из REST API. Аналогично можно убрать любые другие эндпоинты — комментарии, медиафайлы, таксономии.
## 2. Ограничение доступа только для авторизованных пользователей
Если полное отключение нежелательно, можно закрыть эндпоинт для неавторизованных запросов:
php
add_filter( ‘rest_authentication_errors’, function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error(
‘rest_not_logged_in’,
‘Доступ только для авторизованных пользователей.’,
array( ‘status’ => 401 )
);
}
return $result;
});
Внимание: этот вариант блокирует весь REST API для гостей, что может сломать работу плагинов (WooCommerce, Gutenberg и др.).
## 3. Отключение REST API полностью для неавторизованных
Более точечный подход — проверять конкретный маршрут внутри хука:
php
add_action( ‘rest_api_init’, function() {
register_rest_route( ‘custom/v1’, ‘/block-users’, array(
‘permission_callback’ => function() {
return current_user_can( ‘manage_options’ );
}
));
});
## 4. Использование плагинов
Если не хочется писать код, используйте плагины:
— **Disable REST API** — отключает API для незалогиненных пользователей.
— **WP Hide & Security Enhancer** — скрывает и переименовывает стандартные маршруты.
— **iThemes Security / Wordfence** — комплексная защита с опцией ограничения REST API.
## 5. Дополнительные меры безопасности
— Измените стандартный префикс `/wp-json/` через `.htaccess` или плагин.
— Заблокируйте доступ к `/wp-json/` на уровне веб-сервера (Nginx/Apache) для определённых IP.
— Используйте аутентификацию через JWT или Application Passwords для API-запросов.
— Регулярно проверяйте список активных маршрутов через `/wp-json/` и удаляйте неиспользуемые.
Комбинирование этих методов обеспечит надёжную защиту REST API WordPress без потери функциональности сайта.
