WordPress REST API — мощный инструмент, который позволяет взаимодействовать с сайтом через HTTP-запросы. Однако открытость API порой становится уязвимостью, когда неавторизованные пользователи или боты пытаются получить доступ к данным или выполнять нежелательные действия. В этой статье мы подробно рассмотрим, как защитить REST API WordPress от неавторизованных запросов, используя как встроенные возможности, так и сторонние плагины, а также создадим собственные решения с примерами кода.
Почему важно защищать REST API WordPress
REST API в WordPress открыт по умолчанию и позволяет получать публичные данные сайта без авторизации. Однако некоторые эндпоинты могут раскрывать чувствительную информацию или позволять выполнять действия, если не настроена должная защита. К примеру, злоумышленники могут:
- Собирать информацию о пользователях, их ролях и правах.
- Проводить атаки перебором (brute force) через API.
- Использовать API для массового создания или удаления данных.
Поэтому важно ограничивать доступ к REST API и проверять авторизацию для критичных запросов.
Как ограничить доступ к REST API с помощью кода
Отключение REST API для неавторизованных пользователей
Самый простой способ — полностью блокировать REST API для гостей и разрешать только авторизованным пользователям. Для этого добавим фильтр в файл functions.php вашей темы или в кастомный плагин:
add_filter('rest_authentication_errors', 'wpauth_filter_rest_api_access');
function wpauth_filter_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;
}Этот код блокирует все запросы к REST API, если пользователь не вошёл в систему. Такой подход очень простой, но может сломать работу публичных функций, которые используют API, например, получение публичных постов.
Избирательное ограничение доступа к определённым эндпоинтам
Если нужно заблокировать не весь API, а только чувствительные маршруты, можно проверять URI запроса:
add_filter('rest_authentication_errors', 'wpauth_restrict_rest_routes');
function wpauth_restrict_rest_routes($result) {
if (!empty($result)) {
return $result;
}
$request = rest_get_server()->get_current_request();
$route = $request->get_route();
$restricted_routes = [
'/wp/v2/users',
'/wp/v2/comments',
'/wp/v2/settings'
];
foreach ($restricted_routes as $restricted_route) {
if (strpos($route, $restricted_route) === 0 && !is_user_logged_in()) {
return new WP_Error('rest_forbidden', 'Доступ к этому API ограничен.', ['status' => 401]);
}
}
return $result;
}Так мы разрешим публичный доступ к общим данным, но закроем чувствительные разделы.
Двухфакторная аутентификация для REST API
Для повышения безопасности можно добавить двухфакторную аутентификацию (2FA) при доступе к API. Один из способов — использовать JWT-токены с дополнительной проверкой.
Популярный плагин Clearfy Pro предлагает опции безопасности, включая защиту REST API и 2FA. Его можно использовать как готовое решение без написания кода.
Добавление токенов авторизации для REST API
Для внешних приложений и сервисов удобно использовать авторизацию через токены. Рассмотрим пример реализации JWT аутентификации:
add_action('rest_api_init', function () {
register_rest_route('wpauth/v1', '/token', array(
'methods' => 'POST',
'callback' => 'wpauth_generate_jwt_token',
'permission_callback' => '__return_true',
));
});
function wpauth_generate_jwt_token(WP_REST_Request $request) {
$username = $request->get_param('username');
$password = $request->get_param('password');
$user = wp_authenticate($username, $password);
if (is_wp_error($user)) {
return new WP_Error('invalid_credentials', 'Неверное имя пользователя или пароль', ['status' => 403]);
}
$issuedAt = time();
$expire = $issuedAt + (DAY_IN_SECONDS);
$payload = [
'iss' => get_site_url(),
'iat' => $issuedAt,
'exp' => $expire,
'user_id' => $user->ID,
];
$jwt = JWT::encode($payload, 'секретный_ключ');
return ['token' => $jwt];
}Для работы с JWT можно использовать библиотеку firebase/php-jwt. После выдачи токена, API запросы должны содержать заголовок Authorization: Bearer <token>, и вы проверяете его в каждом запросе.
Использование плагинов для защиты REST API
Если нет желания писать код, можно применить готовые плагины:
- Clearfy Pro — расширенная безопасность, ограничение REST API, блокировка по IP, 2FA, упрощённая настройка.
Подробнее на WPSHOP - Disable REST API — простой плагин, который отключает REST API для неавторизованных пользователей.
- JWT Authentication for WP REST API — реализует JWT авторизацию и позволяет интегрировать API с внешними сервисами.
Логирование и мониторинг REST API запросов
Для контроля и безопасности рекомендуется вести логи обращений к API. Это поможет выявить подозрительную активность и своевременно реагировать. Можно использовать плагины типа WP Activity Log или настроить собственные хуки:
add_action('rest_api_init', function () {
add_filter('rest_pre_dispatch', function ($response, $server, $request) {
$route = $request->get_route();
$ip = $_SERVER['REMOTE_ADDR'];
error_log("REST API call to $route from IP $ip");
return $response;
}, 10, 3);
});Это поможет записывать в логи все вызовы API с указанием маршрута и IP адреса.
Итоги и рекомендации по защите REST API WordPress
Защита REST API — обязательный элемент безопасности современного сайта на WordPress. В зависимости от задач, можно:
- Полностью закрыть API для гостей — простой и эффективный метод.
- Ограничить доступ к критичным маршрутам.
- Использовать токены и JWT для авторизации внешних сервисов.
- Применять двухфакторную аутентификацию и плагины безопасности, такие как Clearfy Pro.
- Вести логи и мониторить активность для раннего выявления угроз.
Используя описанные методы и примеры кода, вы сможете обеспечить надежную защиту REST API на вашем сайте WordPress, сохраняя при этом удобство и функциональность.