WordPress REST API: почему не отключать полностью, а закрывать только для неавторизованных

Уведомление о партнёрских ссылках v3.1
Уведомление о партнёрских ссылках v3.2 (мобильная версия)

WordPress REST API раскрывает имена пользователей сайта по адресу wp-json даже незалогиненным посетителям. Если отключить его полностью, редактор блоков иногда не может сохранить запись, поэтому разбираем, как закрыть только запросы без входа и проверить это по ответу 401.

1️⃣ Что такое WordPress REST API: адрес wp-json и его задачи

WordPress REST API — встроенная функция WordPress, которая обменивается данными сайта — записями, страницами, пользователями — в формате JSON и отвечает по адресу /wp-json/ после адреса сайта.

Под /wp-json/ адреса разделены по типам данных — [wp/v2/posts], [wp/v2/pages], [wp/v2/users], — и каждый такой адрес называется эндпоинтом. Редактор блоков тоже отправляет запросы на эти адреса, когда сохраняет запись.

https://example.com/wp-json/
https://example.com/wp-json/wp/v2/posts
https://example.com/wp-json/wp/v2/pages
https://example.com/wp-json/wp/v2/users

2️⃣ Имена пользователей, видные через wp-json

  • ↪️ Зачем закрывать: users 401 · видно и на страницах авторов

Эндпоинт [wp/v2/users] возвращает отображаемое имя и slug каждого пользователя, публиковавшего записи, а в slug по умолчанию попадает логин как есть. У администратора тестового сайта https://testpilotweb.com/ slug тоже совпадал с логином.

Если логин раскрыт, злоумышленнику остаётся подобрать только пароль; на странице входа WordPress тестового сайта 7 октября 2026 года за один день записали 2570 попыток перебора.

Даже если закрыть этот адрес, тот же логин остаётся в адресе страницы автора (/author/логин/).

3️⃣ Что ломается при полном отключении

  • ↪️ Сохранение в редакторе блоков · 0 инструментов MCP

Если полностью отключить WP REST API, первым делом перестаёт сохраняться запись в редакторе блоков, поэтому Perfmatters, один из плагинов оптимизации WordPress, делит отключение на два уровня: [Отключить для не-администраторов] и [Отключить при выходе из системы]. На сайтах с авторами или участниками [Отключить для не-администраторов] не даст этим аккаунтам сохранять записи.

Даже на сайте, закрытом только для неавторизованных, после подключения MCP-коннектора в claude.ai и завершения авторизации отображалось 0 инструментов. В логе сервера все запросы MCP были с кодом 401: Perfmatters блокировал запрос раньше, чем MCP проверял токен.

Значение [Отключить REST API]Адрес users для неавторизованныхСохранение записей не-администраторамиКому подходит
По умолчанию (включено)Имена пользователей видныСохраняется—
Отключить для не-администраторов401Не сохраняетсяСайты без авторов и участников
Отключить при выходе из системы401СохраняетсяСайты с авторами; для подключений по токену, например MCP, добавить исключения

4️⃣ Закрыть только для неавторизованных (Perfmatters)

  • ↪️ Где настроить · проверка ответа 401

В админке WordPress откройте [Настройки] → [Perfmatters] → [Общие], в разделе [Ядро] переключите [Отключить REST API] на [Отключить при выходе из системы] и нажмите [Сохранить изменения].

WordPress Settings → Perfmatters → General (WordPress REST API)
Perfmatters Disable REST API: Disable When Logged Out

Языки Perfmatters: английский (по умолчанию), корейский, немецкий, французский, итальянский, нидерландский, португальский (Бразилия), русский, украинский, турецкий, болгарский, венгерский, индонезийский, персидский, китайский (упрощённый)

Perfmatters settings simulator: General → Core
Симулятор настроек Perfmatters · Обзор и руководство по Perfmatters

Если открыть /wp-json/wp/v2/users в окне инкогнито без входа, придёт ответ 401 с сообщением [У вас нет разрешения на запросы к REST API.], а редактор блоков под вашим входом по-прежнему сохраняет записи.

🔌 Один запрос — два ответа GET /wp-json/wp/v2/users
Сайт без блокировки
200
Имена пользователей видят даже незалогиненные посетители.
[
  {
    "id": 1,
    "name": "User A",
    "slug": "user_a",
    "link": "https://example.com/author/user_a/"
  }
]
Сайт с [Отключить при выходе из системы]
401
Запросы без входа получают ответ 401 с сообщением.
{⏎  "code": "rest_authentication_error",⏎  "message": "У вас нет разрешения на запросы к REST API.",⏎  "data": { "status": 401 }⏎}
slug По умолчанию в slug попадает логин как есть.
Слева из ответа взяты только четыре поля — id, name, slug, link, — имя условное (user_a).


5️⃣ Исключения для закрытых путей

  • ↪️ Исключение для MCP · чем отличается удаление ссылок REST API

Чтобы при блокировке открыть только определённый путь, добавьте его в фильтр Perfmatters [perfmatters_rest_api_exceptions]. Проблему с 0 инструментов у MCP-коннектора claude.ai решил PHP-сниппет в меню Perfmatters [Код], который делает исключение только для пути MCP.

add_filter('perfmatters_rest_api_exceptions', function($exceptions) {
    $exceptions[] = '/mcp/mcp-oauth-server';
    return $exceptions;
});

Даже после исключения запросы без токена блокирует сам MCP — с сообщением [MCP authentication required.] и ответом 401, а /wp-json/wp/v2/users по-прежнему возвращает 401 от Perfmatters.

🚦 Через что проходит запрос
До исключения · запрос MCP
Запрос MCP-коннектора claude.ai после авторизации при включённом [Отключить при выходе из системы].
Perfmatters
Блок 401
→↓
Проверка токена MCP
Не доходит
→↓
Результат
0 инструментов
После исключения · запрос MCP
/mcp/mcp-oauth-server Путь добавлен в исключения Perfmatters.
Perfmatters
Проходит как исключение
→↓
Проверка токена MCP
Проверяет сам MCP
→↓
Результат
Без токена — 401
[MCP authentication required.]
После исключения · /wp-json/wp/v2/users
Пути вне исключений остаются закрытыми.
Perfmatters
Блок 401
→↓
Результат
Имена пользователей по-прежнему скрыты
⚠️ Perfmatters блокирует запрос раньше, чем MCP проверяет токен.

[Удалить ссылки на REST API] в том же разделе [Ядро] убирает только ссылку api.w.org из заголовка страницы и заголовков ответа, а сам WP REST API продолжает отвечать.

🔢 FAQ & рекомендуемые материалы

xmlrpc.php — другой адрес, чем REST API, поэтому он отвечает, даже когда REST API закрыт. Тестовый сайт 8 октября 2026 года за один день получил 734 POST-запроса к xmlrpc.php, а Perfmatters закрывает его опцией [Отключить XML-RPC] в том же разделе [Ядро].

WP Rocket держит адреса /wp-json/ в списке исключений кеша, поэтому ответы REST API меняются сразу после сохранения. Настройки, меняющие HTML страницы, вроде [Удалить ссылки на REST API], применяются после очистки кеша.

Нет. Редактор блоков WordPress при сохранении записи отправляет запросы в REST API, а MCP-коннекторы, подключающие ИИ-инструменты вроде claude.ai, тоже используют пути под /wp-json/.

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 1   +   3   =