Диагностика проблемы: почему нужно очищать 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).