WordPress REST API (WP JSON API) — мощный инструмент, позволяющий взаимодействовать с сайтом через HTTP-запросы. Но по умолчанию он открыт для всех, что может создавать потенциальные риски безопасности и раскрывать информацию, которую не хотелось бы показывать всем подряд. В этой статье мы подробно рассмотрим, как спрятать WP JSON API от посторонних, ограничить доступ и при этом сохранить работоспособность вашего сайта.
Что такое WP JSON API и почему его стоит скрывать
WP JSON API — это интерфейс, через который можно получить данные сайта в формате JSON. Он используется в мобильных приложениях, фронтенд-проектах, плагинах и темах. Но если оставить его открытым, злоумышленники смогут собирать информацию о структуре сайта, пользователях, опубликованных материалах и многом другом.
Особенно уязвимы сайты с публичной информацией о пользователях, где в API доступны имена, роли и ID. Это облегчает подготовку атак, таких как подбор паролей (Brute Force) и социальная инженерия.
Поэтому лучше ограничить доступ к WP JSON API, разрешая запросы только авторизованным пользователям или определённым IP, либо вообще отключить его там, где он не нужен.
Как отключить WP JSON API полностью (простой способ)
Если ваш сайт не использует REST API, самый простой способ — полностью его отключить. Для этого добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wphide_disable_rest_api() {
if (!is_user_logged_in()) {
wp_die('REST API доступ запрещен.', '', array('response' => 403));
}
}
add_action('rest_api_init', 'wphide_disable_rest_api', 1);
Этот код блокирует все REST-запросы для неавторизованных пользователей, возвращая ошибку 403. Для гостей API становится недоступен, но для авторизованных пользователей — работает.
Как ограничить доступ к WP JSON API по IP адресу
Если вы хотите разрешить работу с API только с определённых IP-адресов, например, с вашего офиса или сервера, можно сделать так:
function wphide_restrict_rest_api_ip() {
$allowed_ips = array('123.123.123.123', '111.222.333.444'); // замените на ваши IP
$client_ip = $_SERVER['REMOTE_ADDR'] ?? '';
if (!in_array($client_ip, $allowed_ips) && !is_user_logged_in()) {
wp_die('Доступ к REST API ограничен.', '', array('response' => 403));
}
}
add_action('rest_api_init', 'wphide_restrict_rest_api_ip', 1);
Такой способ удобен, если API используется для внутренних нужд и не должен быть публичным.
Как скрыть информацию о пользователях из WP JSON API
Частая проблема — в REST API открытое представление списка пользователей, что раскрывает их имена, логины и ID. Это можно исправить, убрав эндпоинт с пользователями или ограничив его доступ.
Чтобы полностью убрать доступ к списку пользователей через REST API, добавьте следующий фильтр:
function wphide_disable_rest_api_users($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
}
return $endpoints;
}
add_filter('rest_endpoints', 'wphide_disable_rest_api_users');
Теперь никто не сможет получить данные о пользователях через API.
Использование плагина Clearfy Pro для управления REST API
Если вы предпочитаете не писать код, можно воспользоваться плагином Clearfy Pro. Он умеет отключать REST API для гостей, скрывать пользователей и многое другое в области оптимизации и безопасности.
Clearfy Pro предоставляет удобный интерфейс для управления доступом к API без ручного редактирования кода. Особенно полезно для администраторов без опыта программирования.
Как проверить, что WP JSON API действительно скрыт
После внесения изменений стоит убедиться, что REST API действительно недоступен для посторонних:
- Откройте браузер в режиме инкогнито и перейдите по адресу
https://ваш-сайт.ru/wp-json/wp/v2/users. Вы должны получить ошибку 403 или сообщение о запрете доступа. - Используйте онлайн-инструменты для тестирования REST API, например, resttesttest.com.
- Проверьте логи сервера на наличие попыток доступа и блокировок.
Как включить REST API выборочно для определённых плагинов и тем
Иногда REST API нужен для работы отдельных плагинов или тем, но при этом хочется ограничить доступ для посторонних. В этом случае можно добавить логику, которая разрешает запросы только для нужных плагинов или с определённым параметром.
Например, разрешим доступ только при наличии специального токена в заголовке:
function wphide_rest_api_token_auth( $result ) {
// Разрешаем для авторизованных
if (is_user_logged_in()) {
return $result;
}
$headers = getallheaders();
if (isset($headers['X-API-Token']) && $headers['X-API-Token'] === 'secret_token_123') {
return $result;
}
return new WP_Error('rest_forbidden', 'Доступ к REST API ограничен', array('status' => 403));
}
add_filter('rest_authentication_errors', 'wphide_rest_api_token_auth');
Такой подход позволяет интегрироваться с внешними сервисами, сохраняя безопасность.
Итоги
WP JSON API — полезный, но потенциально опасный инструмент. Оптимальная практика — ограничить доступ к нему, особенно для неавторизованных пользователей и внешних IP. Используйте приведённые выше примеры кода или удобные инструменты, такие как Clearfy Pro, чтобы защитить ваш сайт.
Не забывайте регулярно проверять доступность REST API и обновлять методы защиты вместе с изменениями в WordPress и плагинах.