Работа с REST API в WordPress открывает большие возможности для расширения функционала сайтов и интеграции с внешними системами. Но одно из часто возникающих вопросов — как ограничить сохранение данных через REST API, чтобы защитить сайт от нежелательных или вредоносных изменений?
Почему важно ограничивать сохранение данных через REST API
REST API позволяет создавать, обновлять и удалять записи, пользователей, метаданные и многое другое. Если оставить все без ограничений, это может привести к нескольким проблемам:
- Нарушение безопасности — посторонние смогут изменять контент и настройки.
- Непреднамеренные ошибки — автоматические скрипты или плагины могут отправлять некорректные данные.
- Перегрузка сервера — из-за частых или больших запросов.
Поэтому важно реализовать ограничения для сохранения данных, например, проверять права пользователя, фильтровать входящие данные и ограничивать частоту запросов.
Как работает сохранение данных через REST API в WordPress
Для сохранения данных WordPress использует REST API маршруты, например:
/wp-json/wp/v2/posts— для работы с записями./wp-json/wp/v2/users— для управления пользователями.
Каждый маршрут обрабатывается соответствующими callback-функциями, в которых можно добавить проверки и ограничения.
Для добавления своих ограничений или изменений в стандартные маршруты можно использовать фильтры и хуки, такие как rest_pre_insert_{$this->post_type}, rest_request_before_callbacks и другие.
Практическое решение: ограничение сохранения записей через REST API
Рассмотрим пример, как ограничить сохранение записей (post type post) только пользователям с ролью редактора (editor) и выше. Если пользователь не имеет достаточных прав, запрос будет отклонён.
add_filter('rest_pre_insert_post', 'wp_blog_restrict_rest_save_post', 10, 2);
function wp_blog_restrict_rest_save_post($prepared_post, $request) {
if (!current_user_can('edit_others_posts')) {
return new WP_Error('rest_forbidden', 'У вас нет прав для сохранения этой записи через REST API', array('status' => 403));
}
return $prepared_post;
}Здесь мы подключаемся к фильтру rest_pre_insert_post, который вызывается перед сохранением записи. Функция проверяет, есть ли у текущего пользователя возможность edit_others_posts, которая есть у редакторов и администраторов. Если права отсутствуют — возвращаем ошибку с кодом 403.
Расширение: ограничение по полям данных
Допустим, нужно запретить изменение определённого метаполя через REST API, например, метаполя wp_blog_custom_meta. Для этого можно добавить проверку в том же фильтре:
add_filter('rest_pre_insert_post', 'wp_blog_restrict_meta_field', 20, 2);
function wp_blog_restrict_meta_field($prepared_post, $request) {
if (isset($request['meta']['wp_blog_custom_meta'])) {
return new WP_Error('rest_forbidden', 'Изменение поля wp_blog_custom_meta запрещено через REST API', array('status' => 403));
}
return $prepared_post;
}Таким образом, если кто-то попытается изменить это поле, запрос отклонится.
Ограничение частоты запросов: защита от DDoS и спама
Для дополнительной защиты полезно ограничивать частоту запросов к REST API. Это можно сделать с помощью плагинов, например, Clearfy Pro, который умеет управлять лимитами обращений.
Если хочется реализовать простое ограничение самостоятельно, можно использовать transient для хранения времени последнего запроса и блокировать следующие, если они приходят слишком часто:
add_filter('rest_pre_dispatch', 'wp_blog_limit_rest_api_requests', 10, 3);
function wp_blog_limit_rest_api_requests($response, $server, $request) {
$user_id = get_current_user_id();
if (!$user_id) {
return $response; // только для авторизованных
}
$transient_key = 'wp_blog_rest_last_request_' . $user_id;
$last_request = get_transient($transient_key);
$limit_seconds = 5; // минимальный интервал между запросами
if ($last_request && (time() - $last_request) < $limit_seconds) {
return new WP_Error('rest_too_many_requests', 'Слишком часто обращаетесь к REST API, попробуйте позже', array('status' => 429));
}
set_transient($transient_key, time(), $limit_seconds);
return $response;
}Этот код блокирует повторные запросы от одного пользователя чаще, чем раз в 5 секунд.
Примеры полезных плагинов для расширенного контроля REST API
Для более гибкой настройки и безопасности можно использовать плагины, которые дают интерфейс и дополнительные возможности:
- WP Disable REST API — отключает REST API для неавторизованных пользователей или полностью.
- REST API Toolbox — позволяет настраивать права доступа к отдельным маршрутам.
- Clearfy Pro — комплексное решение для оптимизации и безопасности, включая управление доступом к REST API.
Итоги и рекомендации по ограничению сохранения данных через REST API
Чтобы повысить безопасность и стабильность сайта на WordPress, обязательно:
- Проверяйте права пользователей при сохранении данных через REST API.
- Фильтруйте и валидируйте входящие данные.
- Ограничивайте частоту запросов, чтобы избежать перегрузки.
- Используйте проверенные плагины для управления и контроля REST API.
- Тестируйте все изменения на тестовом сайте перед применением в продакшене.
Приведённые примеры кода легко адаптировать под ваши задачи и типы записей. Они помогут защитить сайт от нежелательных изменений и обеспечат стабильную работу API.