Диагностика проблемы: зачем ограничивать доступ к REST API
REST API WordPress открыт по умолчанию и предоставляет интерфейс для взаимодействия с сайтом. Однако если REST API доступен всем пользователям, включая гостей, это может привести к утечке информации и повышенному риску атак. Особенно это актуально для сайтов с ограниченным контентом или коммерческих проектов.
Для проверки текущего статуса откройте в браузере адрес https://ваш-сайт.ru/wp-json/wp/v2/posts. Если вы видите список постов без авторизации, значит REST API доступен публично.
Пошаговое решение: отключение REST API для гостей
1. Добавление фильтра для ограничения доступа
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин. Этот код запретит доступ к REST API незалогиненным пользователям, возвращая ошибку 401:
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;
});2. Проверка работы ограничения
После добавления кода попробуйте открыть адрес REST API в режиме инкогнито или из браузера, где вы не авторизованы. Вы должны получить JSON с ошибкой и статусом 401. Авторизованные пользователи должны сохранять доступ.
Проверка результата после внедрения
- Откройте
https://ваш-сайт.ru/wp-json/в режиме гостя — должен быть вывод с ошибкой. - Зайдите под учетной записью администратора — доступ должен быть доступен.
- Для автоматизированной проверки используйте curl:
curl -I https://ваш-сайт.ru/wp-json/wp/v2/posts— в ответе должен быть статус 401 для неавторизованных.
Частые ошибки и как их исправить
Ошибка 1: REST API полностью недоступен даже для авторизованных
Причина: возможно, в коде есть конфликт с другими фильтрами или вызов rest_authentication_errors прерывает цепочку. Убедитесь, что ваш код возвращает $result, если не блокирует доступ.
Ошибка 2: Ошибки в синтаксисе PHP при вставке кода
Проверьте правильность скобок и точек с запятой. Используйте редактор с подсветкой синтаксиса.
Ошибка 3: Плагин кеширования отдает старые версии API
Очистите кеш сайта и браузера, настройте исключения для REST API в плагинах кеширования.
Практические советы по безопасности и производительности
- Отключая REST API для гостей, вы уменьшаете поверхность атаки.
- Если вам нужно оставить публичный доступ к некоторым эндпоинтам (например, для публичных данных), используйте
rest_endpointsфильтр для выборочного отключения. - Для повышения производительности исключите REST API из кеширования страниц, чтобы избежать выдачи устаревших данных.
- Используйте плагины безопасности, например Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpfix.ru&utm_medium=article&utm_campaign=otkluchenie-rest-api-dlya-neavtorizovannyh-polzovatelej-v-wordpress), которые имеют готовые настройки по ограничению REST API.
Сравнение способов ограничения доступа к REST API
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр rest_authentication_errors | Блокирует REST API для гостей с ошибкой 401 | Простой, не требует сторонних плагинов, гибко настраивается | Может конфликтовать с плагинами, требует тестирования |
| Плагины безопасности | Готовые решения с UI | Удобно для неразработчиков, дополнительные функции безопасности | Нагрузка на сайт, возможные конфликты, ограниченная кастомизация |
| Отключение REST API через .htaccess | Блокировка доступа на уровне сервера | Очень эффективно, не нагружает PHP | Блокирует все запросы, даже легитимные, требует доступа к серверу |