Удаление скриптового кода из WP REST API: безопасное решение

Диагностика проблемы: почему нужно очищать WP REST API от скриптового кода

WP REST API предоставляет мощный интерфейс для работы с данными сайта, но иногда в ответах API попадает лишний JavaScript или HTML с встроенными скриптами. Это часто происходит при использовании сторонних плагинов или тем, которые добавляют <script> теги в содержимое полей, что может привести к уязвимостям XSS или к конфликтам на стороне клиента.

Чтобы убедиться, что проблема именно в скриптах в ответах REST API, выполните следующие шаги диагностики:

  • Откройте консоль браузера (F12) и перейдите на вкладку Network.
  • Отправьте REST-запрос, например, /wp-json/wp/v2/posts.
  • Посмотрите ответ и проверьте, есть ли в полях контента <script> или подозрительный JavaScript.
  • Если присутствует – значит, API возвращает нежелательный код.

Пошаговое решение: очистка содержимого REST API от скриптов

1. Использование фильтра rest_prepare_* для очистки полей

WordPress позволяет перехватывать данные перед отправкой в REST API через фильтры вида rest_prepare_post, rest_prepare_page и т.п. Мы можем использовать этот механизм, чтобы обработать поля и удалить из них скрипты.

function wpprotect_clean_rest_api_scripts( $response, $post, $request ) {
    // Получаем данные из ответа
    $data = $response->get_data();

    // Очищаем поле 'content.rendered' от скриптов
    if ( isset( $data['content']['rendered'] ) ) {
        $data['content']['rendered'] = wp_kses( $data['content']['rendered'], wp_kses_allowed_html( 'post' ) );
    }

    // Повторяем для других полей, если необходимо

    // Устанавливаем обновленные данные обратно в ответ
    $response->set_data( $data );

    return $response;
}
add_filter( 'rest_prepare_post', 'wpprotect_clean_rest_api_scripts', 10, 3 );

В этом примере мы очищаем поле content.rendered, разрешая только разрешённые HTML-теги, без скриптов.

2. Расширение очистки на кастомные типы записей и другие поля

Если у вас есть кастомные типы записей или другие поля, расширьте функцию аналогично:

add_filter( 'rest_prepare_custom_post_type', 'wpprotect_clean_rest_api_scripts', 10, 3 );

И добавьте очистку нужных полей в теле функции.

Проверка результата после внедрения

После внесения изменений проверьте:

  • Отправьте REST-запросы к API и убедитесь, что в полях контента отсутствуют <script> и другие вредоносные теги.
  • Проверьте работу фронтенда, который использует REST API, чтобы убедиться, что контент отображается корректно и без ошибок.
  • Проверьте консоль браузера на отсутствие ошибок JavaScript, связанных с API.

Частые ошибки и как их исправить

  • Удаление слишком большого количества HTML-тегов: если использовать слишком строгий фильтр, можно сломать форматирование. Решение: используйте wp_kses_allowed_html('post'), чтобы сохранить стандартный набор тегов.
  • Пропуск кастомных полей: если скрипты попадают в кастомные поля, их тоже нужно обрабатывать. Решение: расширьте функцию очистки на все поля, которые могут содержать HTML.
  • Добавление фильтра с неправильным приоритетом: фильтр с низким приоритетом может сработать после другого обработчика, возвращая скрипты обратно. Решение: задайте приоритет 10 или меньше.

Практические советы по безопасности и производительности

  • Не отключайте REST API полностью, если используете плагины и темы, которые зависят от него.
  • Используйте wp_kses для очистки, а не простое удаление тегов через регулярные выражения.
  • Оптимизируйте функцию очистки, чтобы не обрабатывать большие объемы данных лишний раз — фильтруйте только необходимые поля.
  • Если используете Clearfy Pro от WPShop, его модуль оптимизации безопасности может помочь в автоматическом удалении опасных элементов из API (https://wpshop.ru/plugins/clearfy?utm_source=wpprotect.ru&utm_medium=article&utm_campaign=kak-udalit-skriptovyj-kod-iz-wp-rest-api-bez-poteri-funkcionala).
Как отключить XML-RPC в WordPress для повышения безопасности сайта
04.12.2025
Как использовать nonces в WordPress для защиты форм и AJAX-запросов
01.05.2026
Как защитить WordPress от привилегированных пользователей с помощью ролей и возможностей
03.04.2026
Как установить ограничения на регистрацию в WordPress: практические методы и примеры кода
21.01.2026
Как защитить WordPress от SQL-инъекций: практические методы и примеры кода
11.01.2026