REST API в WordPress — мощный инструмент, позволяющий взаимодействовать с сайтом из внешних приложений и плагинов. Однако чрезмерное количество запросов к REST API может привести к нагрузке на сервер и замедлению работы сайта, а в некоторых случаях — к DoS-атакам. В этой статье разберём, как установить лимит на количество запросов к REST API, чтобы защитить сайт и обеспечить стабильную работу.
Почему важно ограничивать количество запросов к REST API
REST API открыт по умолчанию и доступен всем пользователям, включая незарегистрированных. Это значит, что злоумышленники или боты могут отправлять сотни и тысячи запросов в секунду, что приведёт к повышенной нагрузке на сервер и потенциальному отказу в обслуживании.
Кроме того, некоторые легитимные сервисы и плагины могут выполнять периодические запросы, которые тоже нужно контролировать для сохранения производительности.
Ограничение количества запросов (rate limiting) помогает:
- Предотвратить злоупотребления API;
- Снизить нагрузку на сервер;
- Обеспечить справедливое распределение ресурсов;
- Повысить безопасность сайта.
Способы установки лимита на запросы REST API WordPress
1. Использование готовых плагинов
Для ограничения запросов можно использовать плагины, которые реализуют rate limiting на уровне REST API. Например:
- Rate Limit REST API — простой плагин для ограничения количества запросов с одного IP за время.
- Clearfy Pro — комплексный плагин для оптимизации и безопасности WordPress, в том числе умеет ограничивать REST API.
Плюс таких решений в простоте установки и настройки, минус — ограниченный контроль и возможная нагрузка на сервер.
2. Самостоятельная реализация ограничения запросов через фильтры
Если нужен более гибкий контроль, можно написать собственный код для ограничения REST API. Ниже пример, который ограничивает количество запросов с одного IP до 100 в час.
function wpscan_limit_rest_api_requests() {
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$transient_key = 'wpscan_rest_api_limit_' . md5( $ip );
$requests = (int) get_transient( $transient_key );
if ( $requests >= 100 ) {
wp_send_json_error( array( 'message' => 'Превышен лимит запросов к REST API. Пожалуйста, попробуйте позже.' ), 429 );
exit;
}
set_transient( $transient_key, $requests + 1, HOUR_IN_SECONDS );
}
add_action( 'rest_api_init', 'wpscan_limit_rest_api_requests', 0 );В этом коде для каждого IP адреса хранится количество запросов в течение часа. При превышении лимита выводится ошибка 429 (Too Many Requests).
3. Ограничение запросов к отдельным маршрутам REST API
Иногда нужно ограничить не весь REST API, а только определённые маршруты, например, связанные с пользовательскими данными или заказами. Для этого можно расширить предыдущий код, проверяя текущий маршрут:
function wpscan_limit_rest_api_specific_routes( $request ) {
$allowed_routes = array(
'/wp/v2/posts',
'/wp/v2/users',
);
$route = $request->get_route();
foreach ( $allowed_routes as $allowed_route ) {
if ( strpos( $route, $allowed_route ) === 0 ) {
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$transient_key = 'wpscan_rest_api_limit_' . md5( $ip );
$requests = (int) get_transient( $transient_key );
if ( $requests >= 50 ) {
return new WP_Error( 'rest_limit_exceeded', 'Превышен лимит запросов к API для данного маршрута.', array( 'status' => 429 ) );
}
set_transient( $transient_key, $requests + 1, HOUR_IN_SECONDS );
break;
}
}
return true;
}
add_filter( 'rest_pre_dispatch', function( $response, $server, $request ) {
$limit_check = wpscan_limit_rest_api_specific_routes( $request );
if ( is_wp_error( $limit_check ) ) {
return $limit_check;
}
return $response;
}, 10, 3 );Такой подход позволяет гибко управлять лимитами для различных частей API.
Дополнительные рекомендации по защите REST API
Отключение REST API для незарегистрированных пользователей
Если ваш сайт не использует REST API для публичных запросов, можно ограничить доступ только для авторизованных пользователей. Для этого вставьте следующий код:
function wpscan_disable_rest_api_for_guests( $access ) {
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_cannot_access', 'Доступ к REST API разрешён только авторизованным пользователям.', array( 'status' => 401 ) );
}
return $access;
}
add_filter( 'rest_authentication_errors', 'wpscan_disable_rest_api_for_guests' );<Это сократит количество потенциальных злоумышленников, использующих API.
Использование плагина Clearfy Pro для комплексной защиты
Clearfy Pro предлагает удобный интерфейс для управления доступом к REST API, кэшированием, отключением ненужных функций и защитой от атак. Особенно полезен для тех, кто не хочет заниматься кодом самостоятельно.
Выводы и советы по внедрению ограничения запросов
Установка лимитов на REST API — важный шаг в обеспечении безопасности и стабильности WordPress-сайта. Варианты реализации зависят от ваших навыков и требований:
- Для быстрого решения подойдет плагин Rate Limit REST API или Clearfy Pro.
- Если нужен точный контроль — реализуйте ограничение через фильтры и транзиенты, как показано в примерах.
- Обязательно тестируйте работу сайта после внедрения, чтобы не блокировать легитимные запросы.
- Комбинируйте rate limiting с другими методами защиты REST API для максимальной безопасности.
Используйте приведённые примеры кода, адаптируя их под свои задачи, и ваш WordPress-сайт будет защищён от перегрузок и злоумышленников, использующих REST API.