WordPress REST API — мощный инструмент для взаимодействия с сайтом через HTTP-запросы. Однако открытый доступ к API может стать причиной проблем с безопасностью, если кто-то злоумышленно попытается получить доступ к вашим данным. В этой статье мы подробно разберем, как ограничить доступ к REST API для неавторизованных пользователей, сохранив при этом удобство работы для администраторов и редакторов.
Что такое REST API в WordPress и зачем ограничивать доступ
REST API позволяет получать данные сайта и управлять ими через внешние приложения и скрипты. По умолчанию REST API открыт для всех, что удобно для публичных данных, но часто не желательно для приватных или административных операций.
Злоумышленники могут использовать REST API для сбора информации о сайте, пользователях и контенте, что потенциально может привести к взлому. Поэтому важно ограничить доступ к API только для авторизованных пользователей или определенных ролей.
В следующих разделах рассмотрим несколько способов ограничения доступа: с помощью кода и плагинов, а также разберем примеры реализации.
Ограничение доступа к REST API через functions.php
Самый простой способ — добавить фильтр, который будет проверять, авторизован ли пользователь, и блокировать доступ остальным.
function wpfix_restrict_rest_api_access( $access ) {
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_forbidden', 'Доступ к REST API запрещен', array( 'status' => 401 ) );
}
return $access;
}
add_filter( 'rest_authentication_errors', 'wpfix_restrict_rest_api_access' );Этот код возвращает ошибку 401 (Unauthorized) для всех неавторизованных запросов к REST API. Он защищает ваш сайт от публичного доступа к API, сохраняя доступ для всех пользователей, прошедших авторизацию.
Ограничение по ролям пользователей
Если нужно разрешить доступ не всем авторизованным, а только определенным ролям, например администраторам и редакторам, можно расширить функцию:
function wpfix_restrict_rest_api_by_role( $access ) {
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_forbidden', 'Доступ к REST API запрещен', array( 'status' => 401 ) );
}
$user = wp_get_current_user();
if ( ! array_intersect( array( 'administrator', 'editor' ), $user->roles ) ) {
return new WP_Error( 'rest_forbidden', 'Доступ к REST API запрещен для вашей роли', array( 'status' => 403 ) );
}
return $access;
}
add_filter( 'rest_authentication_errors', 'wpfix_restrict_rest_api_by_role' );Таким образом, только пользователи с ролями администратора и редактора смогут пользоваться REST API.
Использование плагинов для ограничения доступа к REST API
Если вы не хотите вносить код вручную, можно использовать плагины, которые управляют доступом к REST API и расширяют возможности безопасности.
1. Disable REST API
- Простой плагин, который полностью отключает REST API для неавторизованных пользователей.
- Позволяет быстро защитить сайт без программирования.
2. Clearfy Pro
- Многофункциональный плагин оптимизации и безопасности WordPress.
- Имеет опцию отключения REST API для всех или для гостевых пользователей.
- Подробнее о Clearfy Pro с возможностью приобретения можно узнать на официальной странице.
Как проверить, что REST API действительно ограничен
После внесения изменений важно убедиться, что REST API работает так, как ожидается.
Для этого можно выполнить простой запрос через curl или Postman в неавторизованном режиме:
curl -i https://example.com/wp-json/wp/v2/postsЕсли доступ запрещен, вы увидите ответ с ошибкой 401 или 403 и соответствующим сообщением.
Для авторизованных пользователей запрос должен возвращать список постов в формате JSON.
Дополнительные советы по безопасности REST API
1. Ограничьте доступ к REST API только тем маршрутам, которые действительно нужны вашему сайту и внешним приложениям. Можно использовать фильтр rest_endpoints для удаления нежелательных маршрутов.
2. Используйте SSL (https) для всех запросов к REST API, чтобы защитить данные от перехвата.
3. Регулярно обновляйте WordPress, темы и плагины, чтобы закрывать известные уязвимости.
4. Рассмотрите возможность интеграции с плагинами типа WPCommunity для создания защищенных внутренних API и порталов.
Пример ограничения доступа к отдельному маршруту REST API
Иногда нужно запретить доступ только к определенному маршруту, например, к пользовательским данным.
function wpfix_filter_rest_endpoints( $endpoints ) {
if ( isset( $endpoints['/wp/v2/users'] ) ) {
unset( $endpoints['/wp/v2/users'] );
}
return $endpoints;
}
add_filter( 'rest_endpoints', 'wpfix_filter_rest_endpoints' );Этот код удаляет маршрут /wp/v2/users из списка доступных REST API эндпоинтов, предотвращая доступ к списку пользователей.
Выводы
Ограничение доступа к REST API — важная задача для повышения безопасности WordPress-сайта. Варианты решения варьируются от простых фильтров в functions.php до использования специализированных плагинов, таких как Clearfy Pro.
Используйте методы, подходящие именно вашему проекту, и не забывайте проверять работу после внесения изменений.