Диагностика проблемы: зачем ограничивать 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 заблокирован для гостей, выполните проверку:
- Откройте браузер в режиме инкогнито или выйдите из аккаунта WordPress.
- Перейдите по адресу
https://ваш-сайт.ru/wp-json/wp/v2/users— если доступ запрещён, увидите JSON с ошибкой и статусом 401. - Авторизуйтесь в админке и повторите запрос — данные должны отображаться.
Для удобства можно использовать команду 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-ресурсов | Менее гибко, сложно разрешать отдельные маршруты |