Назад

Утро, когда хостинг написал «критическая уязвимость»

Задача: письмо, которое нельзя игнорировать

Однажды утром хостинг прислал предупреждение: в ядре WordPress найдена критическая уязвимость, сайт нужно срочно обновить.

Со стороны это выглядит как «нажмите кнопку Обновить». На деле перед нами были:

  • WordPress 6.3.4 — а актуальная версия 7.0.4. Прыжок через целую эпоху изменений.
  • 19 плагинов — формы, SEO, транслитерация адресов, карта этажей. Часть платная, без действующих лицензий.
  • Авторская тема и поля ACF, на которых держатся шапка, карусель акций и каталоги.
  • Живой сайт с посетителями каждый день.

Один неудачный плагин — и вместо сайта торгового центра посетитель увидит белый экран.

Поэтому правило №1 было простым: на боевом сайте не экспериментируем.

Как мы обновили сайт торгового центра «Глобал Молл» с WordPress 6.3.4 до 7.0.4 — и чуть не поверили, что сломали его раньше, чем начали

Главная страница globalmall.ru после обновления: адрес и график работы, карусель акций, разделы
Главная страница globalmall.ru после обновления: адрес и график работы, карусель акций, разделы
6.3.4 → 7.0.4
ядро WordPress
12
плагинов обновлено
25
магазинов — все на месте
4
темы обновлены

Заказчик

«Глобал Молл» — торговый центр в Москве: десятки магазинов, фудкорт, развлечения, акции и интерактивная схема этажей. Сайт — это витрина ТЦ. Сюда приходят, чтобы найти магазин, узнать часы работы и понять, как добраться.

Если сайт не открывается или показывает пустоту, посетитель просто идёт в другой торговый центр.

Поиск пути

План выглядел надёжно, как по учебнику:

Пять шагов проекта. Третий и четвёртый оказались самыми интересными
Пять шагов проекта. Третий и четвёртый оказались самыми интересными
  • Полный бэкап боевого сайта: файлы и база данных, 678 МБ.
  • Тестовая копия на том же хостинге.
  • Прогон обновления на копии — и только потом обновление рабочего сайта.

Бэкап сделали. Копию развернули. Обновили ядро и плагины прямо на ней — ни одной ошибки. Мы уже почти выдохнули.

А потом открыли копию рядом с оригиналом.

Копия, которая не была копией

Картина получилась странной: визуально всё было на месте, но работало и выглядело совсем не так, как должно.

  • Пропал верхний блок с адресом и графиком работы.
  • Карусель акций превратилась в серый прямоугольник.
  • Вместо аккуратного меню — свалка из всех страниц сайта подряд.
  • «Магазины», «Акции», «Развлечения» открывались пустыми. Торговый центр без магазинов.
Схема: что мы увидели на тестовой копии и как это должно было выглядеть
Схема: что мы увидели на тестовой копии и как это должно было выглядеть

Обновление прошло «успешно». Результат выглядел так, будто сайт сломан. Считать тест пройденным было нельзя.

Версии, которые не сработали

Версия первая — кеш. Боевой сайт мог просто показывать старый закешированный вид. Проверили: признаков кеширования нет, страницы собираются заново на каждый запрос.

Версия вторая — меню не привязано к своим местам. Готовые меню нашлись. Привязали, меню вернулось. Но блок с адресом, карусель и каталоги остались пустыми.

Версия третья — потерялись настройки темы. Начали сверять поля ACF, опции, содержимое главной страницы. Данные в таблицах выглядели одинаково. От этого ситуация казалась совсем тупиковой: информация вроде бы есть, а сайт её не показывает.

Три версии, которые отпали, — и четвёртая, которая объяснила всё
Три версии, которые отпали, — и четвёртая, которая объяснила всё

Поворот сюжета

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

В аккаунте хостинга лежала заброшенная база с похожим названием: старая, давно не используемая, с устаревшей структурой. Вместо современных «Магазинов», «Акций» и «Развлечений» там хранился устаревший формат записей. Тестовую копию мы собрали из этого двойника.

Две базы-близнеца: копию собрали из левой, сайт работает на правой
Две базы-близнеца: копию собрали из левой, сайт работает на правой

Одна неверная точка отсчёта объяснила всё сразу: и пустую шапку, и серую карусель, и свалку вместо меню, и пустые каталоги.

Решение

1. Пересобрали копию из правильной базы. Главная страница, меню, карусель и разделы совпали с боевым сайтом один в один: 25 магазинов, акции, новости, фильтры по этажам и категориям.

Раздел «Магазины»: каталог, фильтры по этажам и категориям
Раздел «Магазины»: каталог, фильтры по этажам и категориям

2. Отработали обновление на копии заново, уже на корректных данных: ядро, плагины, темы.

3. Разобрали ложную тревогу с картой. На копии схема этажей показывала ошибку: ключ Яндекс.Карт привязан к домену боевого сайта, и на тестовом адресе иначе быть не могло. На боевом домене карта работает. Мы это проверили, а не понадеялись.

Интерактивная схема этажей на боевом сайте после обновления
Интерактивная схема этажей на боевом сайте после обновления

4. Обновили боевой сайт в проверенном порядке: плагины → ядро → темы. На время установки обновлений сайт кратковременно переходил в режим обслуживания.

5. Сознательно не трогали три платных плагина (ACF PRO, SearchWP, расширение All-in-One WP Migration). К уязвимости ядра они не относятся, а без лицензионного ключа их обновление всё равно недоступно. Это можно сделать отдельно, когда у заказчика появятся лицензии.

Что обновили на боевом сайте
Что обновили на боевом сайте

6. Проверили результат двумя независимыми способами: через панель WordPress и через служебный RSS-фид сайта, который выдаёт версию движка напрямую из установленных файлов. Оба показали 7.0.4.

7. Заказчику развернули рабочую копию: на время обновления мы закрыли её от индексации поисковиками, чтобы не создавать дубль сайта в выдаче, а после проверки аккуратно удалили вместе с базой, без «хвостов» на хостинге.

Результат

  • Критическая уязвимость закрыта: ядро WordPress обновлено до актуальной версии 7.0.4.
  • Обновлены 12 плагинов и 4 системные темы, в том числе плагины форм обратной связи и SEO.
  • Контент не пострадал: магазины, акции, новости, схема этажей, карусель и формы работают так же, как до обновления.
  • Полный бэкап сохранён на случай отката.
  • Заказчик получил подробный отчёт по версиям и списку того, что намеренно не обновлялось и почему.

Чему нас научил этот проект

Самая опасная поломка — не та, что видна сразу, а красиво работающая копия не того сайта.

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

Услуги: поддержка сайта, обновление и безопасность WordPress.

Обсудить
ваш проект
Утро, когда хостинг написал «критическая уязвимость»
Заказать
такие работы
Заказать звонок
Заказать звонок