Как отключить WordPress REST API и JSON-вывод без потери функциональности

Как отключить WordPress REST API и JSON-вывод без потери функциональности

REST API в WordPress может быть лишним, если вы не используете внешние интеграции или, например, управляете сайтом на VPS без сторонних подключений. Разбираем, как закрыть его от посторонних без сбоев в работе сайта.

Введение

WP лого

Многие владельцы сайтов на WordPress удивляются: зачем их сайт открывает данные через таинственный интерфейс REST API? Действительно, если вы не планируете подключать внешние приложения или сервисы, лишние открытые точки входа ни к чему. Возникает логичный вопрос, можно ли отключить REST API и связанную с ним выдачу данных в формате JSON, чтобы повысить безопасность? Но спешить с отключением нельзя, ведь есть риск нарушить работу самого WordPress.

В статье рассказали, как отключить REST API в WordPress и убрать JSON-вывод, не ломая функциональность сайта. Разобрали, что такое WordPress REST API и зачем он нужен, почему некоторым хочется его отключить, и какие способы позволяют это сделать безопасно.

Аренда VPS/VDS — от ₽219/месяц

Почему выбирают VPS от AdminVPS:

✓ Дешевле физического сервера

✓ Более гибкий и мощный, чем обычный хостинг

✓ Бесплатная защита от DDoS и техподдержка 24/7

✓ Масштабируется под любые задачи

Виртуальный сервер VPS/VDS — ваш личный сервер для сайтов, магазинов, ботов и других проектов.

Что такое REST API и JSON-вывод в WordPress

Прежде чем отключать REST API, стоит понять, что это вообще такое.

WordPress REST API — это интерфейс для доступа к данным вашего сайта по специальным URL и получения этих данных в формате JSON. Проще говоря, WordPress предоставляет внешний адрес .../wp-json/…, обратившись к которому можно получить публичную информацию о сайте, например, список записей, комментарии и так далее, в машиночитаемом виде (JSON). Этот механизм появился в версии WordPress 4.7 и с тех пор встроен в ядро по умолчанию.

JSON (JavaScript Object Notation) — популярный текстовый формат обмена данными, и WordPress активно его использует для взаимодействия с внешними клиентами и приложениями.

REST API позволяет другим программам и сервисам взаимодействовать с вашим сайтом без прямого входа в админку. К примеру, разработчики могут создавать мобильные приложения или веб-сервисы, которые получают или публикуют контент на вашем сайте через REST API. С помощью данного инструмента можно удалённо создавать посты, редактировать записи, получать список пользователей и делать многое другое, отправляя HTTP-запросы к вашему сайту.

Нужно ли отключать WordPress REST API

Несмотря на плюсы для разработчиков, у обычного владельца блога REST API может вызвать беспокойство. Почему некоторые хотят отключить JSON REST API:

  • Соображения безопасности. Дополнительные открытые эндпоинты теоретически расширяют поверхность атаки. Хотя сам по себе WordPress REST API относительно безопасен, он может раскрывать некоторую информацию. Например, через REST API можно получить данные о пользователях и контенте. Если вы этим не пользуетесь, возникает желание закрыть лишнее от посторонних глаз. Есть опасения, что REST API может стать новой лазейкой для DDoS-атак.
  • Производительность и чистота кода. Некоторым администраторам хочется отключить все ненужные функции, которые не используются, чтобы сайт работал быстрее и код выглядел чище. REST API добавляет в код сайта ссылки и скрипты для поддержки внешних запросов. Если вы точно уверены, что никогда не будете этим пользоваться, логично убрать лишний функционал.

Однако важно понимать и обратную сторону. Разработчики WordPress не случайно включили REST API в ядро. Начиная с WordPress 5, сам движок всё активнее использует REST API для работы некоторых встроенных функций. Например, современный блоковый редактор «Гутенберг» запрашивает контент через REST API. Если его полностью отключить, админ-панель при попытке сохранить или обновить запись может выдать ошибку вида «Ответ не является допустимым JSON», то есть, связь с сервером оборвалась. Кроме редактора множество популярных плагинов опираются на REST API. Полное отключение API способно привести к тому, что некоторые функции сайта или плагины перестанут работать корректно.

Отключать WordPress REST API следует очень осторожно. Полностью убирать его из системы не рекомендуется, если только у вас не совсем пустой сайт без редактора и без плагинов. Но вы можете ограничить доступ к REST API для посторонних, сохранив при этом работоспособность всех внутренних инструментов. Именно такой подход мы и рассмотрим.

Как отключить REST API в WordPress, не нарушив работу сайта

Существует несколько способов безопасно отключить REST API, точнее, закрыть его от неавторизованных посетителей. Новичкам проще всего воспользоваться готовым плагином. Тем же, кто предпочитает минимизировать число плагинов, подойдёт метод с добавлением небольшого фрагмента кода. Рассмотрим оба варианта.

Плагин Disable REST API

Специальный плагин Disable REST API решает задачу буквально в один клик. Его можно найти в официальном каталоге WordPress и установить через админ-панель. После установки и активации никакой настройки не требуется. Плагин автоматически блокирует любые запросы к REST API, если они идут от неавторизованных посетителей.

Когда внешний пользователь пытается открыть ваш сайт через API, сервер вместо данных отвечает сообщением об ошибке и статусом 401 Unauthorized. REST API открывает доступ только вам и другим администраторам, вошедшим в систему. Для всех прочих запросы к /wp-json вернут отказ.

Вы можете протестировать работу плагина. Для этого разлогиньтесь из админ-панели или откройте браузер в режиме инкогнито и попробуйте зайти на страницу https://ваш-сайт/wp-json/. Вы увидите ответ, где указано, что доступ запрещён или требуется авторизация. JSON-эндпоинты больше не раскрывают информацию о вашем сайте случайным посетителям. При этом внутри админки ничего не ломается, редактор записей, виджеты и плагины продолжают работать, потому что для авторизованного администратора API остаётся включённым.

Отключение REST API с помощью кода

Второй способ предполагает обойтись без дополнительных плагинов. Достаточно добавить небольшой код, ограничивающий доступ к REST API. Это решение требует минимальных навыков. Нужно отредактировать файл functions.php вашей темы или использовать специальный плагин для вставки пользовательского кода. Если слово код вас не пугает, следуйте инструкции.

Шаг 1. Откройте файл functions.php активной темы WordPress. Сделать это можно через админ-панель, перейдя в раздел «Внешний вид», далее в «Редактор тем», либо через FTP/файловый менеджер хостинга. Рекомендуется создавать дочернюю тему для подобного ручного вмешательства, чтобы изменения не пропали при обновлении шаблона. Альтернативный вариант — установить плагин Code Snippets или аналогичный, который позволяет добавить PHP-сниппет через админку, не трогая файлы темы. Выберите способ, который удобнее.

Шаг 2. В конец файла functions.php, либо в интерфейсе вашего плагина для сниппетов, добавьте следующий код:

// Разрешаем REST API только для авторизованных пользователей
add_filter( 'rest_authentication_errors', function( $result ) {
    // Если другой плагин уже установил ошибку авторизации, сохраняем её
    if ( ! empty( $result ) ) {
        return $result;
    }
    // Блокируем доступ неавторизованным пользователям
    if ( ! is_user_logged_in() ) {
        return new WP_Error(
            'rest_not_logged_in',
            'Требуется авторизация.',
            array( 'status' => 401 )
        );
    }
    return $result; // для залогиненных всё работает как обычно
});

Сохраните изменения. Теперь ваш сайт будет требовать авторизацию для любого REST-запроса. По сути, это то же самое, что делает упомянутый выше плагин. Проверить эффект можно так же, как в предыдущем способе, обратившись к JSON-эндпоинту без авторизации и убедившись, что данных он не выдаёт.

Важно, что администраторы и редакторы по-прежнему смогут использовать REST API. Например, редактор блоков в админке будет спокойно сохранять статьи, ведь вы авторизованы и для вас фильтр пропускает запросы.

Дополнительно этот код можно настроить под свои требования. В текущем виде он разрешает доступ любому вошедшему пользователю даже с минимальной ролью. Если же вы хотите ограничить API только аккаунтом администратора, можно заменить условие проверки. Например, вместо is_user_logged_in() использовать проверку возможности current_user_can('manage_options'). Тогда даже авторизованные пользователи, например, авторы, будут получать отказ, и только админ сможет использовать REST API. Настраивайте по необходимости, но для большинства случаев достаточно закрыть API именно для незалогиненных.

Шаг 3 (опционально). Если хотите убрать упоминания о REST API из кода страниц, можете отключить ссылку на API, которую WordPress выводит в разделе <head> и в HTTP-заголовках.

По умолчанию каждая страница вашего сайта содержит строку:

<link rel="https://api.w.org/" href="...wp-json/" />

Это своего рода указатель на REST API. После ваших действий эта ссылка становится бесполезной. Добавьте ещё несколько строк в functions.php либо туда же, в сниппет:

// Убираем ссылки REST API из HTML и заголовков
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
remove_action( 'template_redirect', 'rest_output_link_header', 11 );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links', 10 );

Эти вызовы удалят генерацию <link rel="https://api.w.org"> в коде страниц, а также отключат соответствующий HTTP-заголовок. Заодно вы убрали и oEmbed discovery link, он тоже связан с JSON API и обычно не нужен, если вы всё отключили. Учтите, что сам API от этого не выключается, да и не нужно, мы же специально оставляем его работающим для своих нужд. Мы лишь убираем внешний маячок, чтобы злоумышленник или сканер не обнаружил сразу, что у сайта есть REST API. Без этой ссылки потенциальному боту чуть сложнее узнать о наличии JSON-эндпоинтов. Конечно, полностью полагаться на скрытие не стоит, но дополнительный штрих к безопасности не помешает.

Не путайте отключение REST API для гостей с полным отключением API. В Интернете можно встретить старые советы и код, который полностью вырубает REST API. Такой радикальный метод сейчас крайне не рекомендуется. Как мы отмечали, полное отключение приведёт к сбоям в работе WordPress. Вы можете столкнуться с тем, что не сохраняются записи, не работают некоторые виджеты или плагины. Главная цель — повысить безопасность без ущерба функциональности, поэтому мы используем компромиссный подход. Если же вы по ошибке применили жёсткое отключение и заметили проблемы, просто уберите тот код и переключитесь на описанный выше безопасный способ.

Заключение

WordPress REST API сам по себе полезен, но если вы им не пользуетесь, разумно ограничить к нему доступ. С помощью простого плагина или пары строчек кода вы усилите безопасность сайта и уберёте лишние ворота, через которые злоумышленники могут добыть информацию. При этом ваш сайт продолжит работать так же, как раньше, ничего не сломается и не отвалится.

Читайте в блоге:

Loading spinner
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Нужен VPS сервер?

Арендуйте мощный VPS сервер для ваших проектов! Быстрая настройка, высокая производительность и надежная поддержка 24/7. Начните прямо сейчас!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях