REST API в WordPress — мощный инструмент, позволяющий работать с данными сайта через HTTP-запросы. Однако по умолчанию многие эндпоинты доступны всем пользователям, включая неавторизованных. Это может представлять угрозу безопасности и нежелательную нагрузку на сервер. В этой статье мы разберём, как ограничить доступ к REST API WordPress только для авторизованных пользователей, а также как реализовать более тонкую настройку прав доступа.
Почему нужно ограничивать доступ к REST API WordPress
REST API открывает множество возможностей, но и несёт риски, если доступ к нему не контролируется:
- Утечка конфиденциальных данных через общие эндпоинты.
- Возможность массовых запросов и DDoS-атак.
- Нежелательное взаимодействие с сайтом со стороны ботов и злоумышленников.
Ограничение доступа позволяет повысить безопасность и снизить нагрузку, разрешая работать с API только авторизованным пользователям, например, редакторам или администраторам.
Как ограничить REST API WordPress только для авторизованных пользователей
Для этого можно использовать фильтр rest_authentication_errors, который позволяет перехватывать запросы к REST API и проверять права доступа перед их выполнением.
Пример кода для ограничения доступа
function wpblock_restrict_rest_api_access($result) {
if (!empty($result)) {
return $result; // Уже есть ошибка, возвращаем её
}
if (!is_user_logged_in()) {
return new WP_Error(
'rest_forbidden',
'Доступ к REST API разрешён только авторизованным пользователям.',
array('status' => 401)
);
}
return $result; // Всё в порядке, разрешаем доступ
}
add_filter('rest_authentication_errors', 'wpblock_restrict_rest_api_access');
Этот код нужно добавить в файл functions.php вашей темы или в собственный плагин. Теперь любые запросы к REST API, сделанные неавторизованными пользователями, будут получать ошибку 401 Unauthorized.
Как настроить доступ для разных ролей пользователей
В большинстве случаев достаточно ограничить доступ для всех неавторизованных, но если нужно более гибко управлять правами — например, разрешить доступ только администраторам и редакторам, а остальным запретить, можно добавить проверку ролей.
Пример с проверкой ролей
function wpblock_restrict_rest_api_by_role($result) {
if (!empty($result)) {
return $result;
}
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 new WP_Error('rest_forbidden', 'У вас нет прав для доступа к REST API.', array('status' => 403));
}
return $result;
}
add_filter('rest_authentication_errors', 'wpblock_restrict_rest_api_by_role');
Такой подход гарантирует, что только пользователи с ролью администратора или редактора смогут обращаться к REST API. Остальным будет отправлена ошибка 403 Forbidden.
Как сделать исключения для публичных эндпоинтов REST API
Иногда требуется оставить открытыми определённые эндпоинты REST API, например, для публичных данных или кастомных маршрутов, которые не несут угрозы безопасности.
Пример с исключением по маршруту
function wpblock_restrict_rest_api_with_exceptions($result) {
if (!empty($result)) {
return $result;
}
$request = rest_get_server()->get_current_request();
$route = $request->get_route();
// Разрешаем доступ к публичному endpoint /wp/v2/posts без авторизации
if (strpos($route, '/wp/v2/posts') === 0) {
return $result;
}
if (!is_user_logged_in()) {
return new WP_Error('rest_forbidden', 'Доступ к REST API разрешён только авторизованным пользователям.', array('status' => 401));
}
return $result;
}
add_filter('rest_authentication_errors', 'wpblock_restrict_rest_api_with_exceptions');
В этом примере мы разрешаем доступ к публичным постам без авторизации, а остальные запросы требуют авторизации.
Плагины для управления доступом к REST API
Если не хочется писать код, можно использовать готовые плагины для ограничения доступа к REST API:
- REST API Authentication — добавляет базовую аутентификацию.
- Disable REST API — полностью отключает REST API для неавторизованных.
- Clearfy Pro — многофункциональный плагин для оптимизации и безопасности, включая управление REST API.
Так, с помощью Clearfy Pro можно тонко настроить, какие части REST API доступны незарегистрированным пользователям, а какие нет, без написания кода.
Резюме и рекомендации по безопасности REST API
Ограничение доступа к REST API — важный шаг в защите вашего сайта на WordPress. Наиболее эффективные практики:
- Используйте фильтр
rest_authentication_errorsдля контроля доступа. - Разрешайте доступ только авторизованным пользователям или выбранным ролям.
- Делайте исключения для публичных эндпоинтов только при необходимости.
- Рассмотрите использование готовых плагинов, например, Clearfy Pro, для удобства и расширенной настройки.
Следуя этим рекомендациям, вы защитите сайт от нежелательных запросов и повысите стабильность работы вашего WordPress проекта.