REST API в WordPress — мощный инструмент для взаимодействия с сайтом через HTTP-запросы. Однако по умолчанию он доступен всем, включая неавторизованных пользователей. Это может создавать потенциальные угрозы безопасности и увеличивать нагрузку на сервер. В этой статье мы подробно рассмотрим, как ограничить доступ к REST API только для авторизованных пользователей, а также приведём примеры кода и рекомендации по плагинам.
Почему стоит ограничивать доступ к REST API в WordPress
REST API позволяет получать и изменять данные сайта, что удобно для интеграций и мобильных приложений. Однако открытый доступ для всех пользователей может привести к следующим проблемам:
- Утечка информации. Некоторые эндпоинты возвращают данные, которые лучше скрыть от гостей (например, данные пользователей).
- Повышенная нагрузка. Автоматические запросы к API могут создавать избыточный трафик и нагружать сервер.
- Уязвимости безопасности. Злоумышленники могут использовать открытый REST API для сканирования сайта и поиска слабых мест.
Поэтому часто возникает задача ограничить REST API только для авторизованной аудитории.
Как отключить REST API для неавторизованных пользователей — базовый метод
Добавим кастомный фильтр, который будет проверять авторизацию и блокировать доступ при отсутствии логина.
add_filter('rest_authentication_errors', 'wpauth_restrict_rest_api_access');
function wpauth_restrict_rest_api_access($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; // Авторизован — доступ разрешён
}
Этот код следует добавить в functions.php вашей темы или в кастомный плагин. Он перехватывает проверку доступа и возвращает ошибку 401 Unauthorized для гостей.
Как работает код
rest_authentication_errors— фильтр для проверки прав доступа к REST API.- Если пользователь не авторизован (
!is_user_logged_in()), возвращается объект ошибкиWP_Errorс сообщением и HTTP статусом 401. - Авторизованные пользователи получают доступ без ограничений.
Ограничение доступа к REST API только для определённых эндпоинтов
Иногда нужно не полностью блокировать REST API для гостей, а только закрыть определённые маршруты. Например, можно разрешить открытый доступ к публичным типам записей, но запретить доступ к пользовательским данным.
Для этого используйте проверку параметра $request->get_route():
add_filter('rest_authentication_errors', 'wpauth_limit_rest_api_endpoints');
function wpauth_limit_rest_api_endpoints($result) {
if (!empty($result)) {
return $result;
}
if (is_user_logged_in()) {
return $result;
}
$allowed_routes = [
'/wp/v2/posts',
'/wp/v2/pages'
];
$request = rest_get_server()->get_current_request();
$route = $request->get_route();
foreach ($allowed_routes as $allowed_route) {
if (strpos($route, $allowed_route) === 0) {
return $result; // Разрешаем доступ к этим маршрутам
}
}
return new WP_Error('rest_cannot_access', 'Доступ к REST API для данного маршрута запрещён.', array('status' => 401));
}
В этом примере гости смогут получать посты и страницы, но не смогут обращаться к другим эндпоинтам REST API.
Использование плагинов для управления доступом к REST API
Если не хочется писать код самостоятельно, можно использовать готовые решения. Вот несколько популярных плагинов:
- Disable REST API — простой плагин, который полностью отключает REST API для неавторизованных пользователей.
- Clearfy Pro — многофункциональный плагин оптимизации и безопасности, в котором есть гибкие настройки ограничения REST API. Подробнее на Clearfy Pro на WPSHOP.ru.
- WP Cerber Security — комплексный плагин безопасности с возможностью блокировки REST API для гостей.
Использование плагинов удобно, если нужно быстро настроить ограничения без ручного кода.
Дополнительные рекомендации по безопасности REST API
Даже при ограниченном доступе к REST API стоит придерживаться следующих советов:
- Регулярно обновляйте WordPress и плагины, чтобы закрыть известные уязвимости.
- Используйте двухфакторную аутентификацию и сложные пароли для пользователей с доступом.
- Ограничьте права пользователей, чтобы минимизировать возможный ущерб при взломе.
- Мониторьте логи доступа для выявления подозрительной активности.
Резюме и выводы
Отключение REST API для неавторизованных пользователей — эффективный способ повысить безопасность и снизить нагрузку на сервер. При этом важно не блокировать публичный контент, если он должен оставаться доступным. Рекомендуется использовать фильтр rest_authentication_errors для гибкого контроля доступа, а при необходимости — готовые плагины, например Clearfy Pro.