Самооборона с гейзенбагом 🥋

💡 Гейзенбаг (Heisenbug) — это такой баг, который исчезает или меняет поведение, как только ты пытаешься его исследовать. Смотришь — и он уже ведёт себя по-другому. Почти как квантовая частица 🧙‍♂️

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

Ситуация вымышленная, все совпадения случайны (ну почти).

На входе: корпоративный сайт на Битриксе, который отдаёт API. Фронт — на Vue 3 / Nuxt. Симптомы: периодически, в разное время, часть фронта просто перестаёт работать, а в браузере — ошибка: Nuxt не работает.

Примерно через 20–60 минут всё само «оживает» и продолжает работать как ни в чём не бывало.

Что говорят логи? 🔍 pm2 — пусто (есть варнинги, но не критичные) 📄 nginx — чисто 🐘 php — молчит 🧱 Битрикс — почти ничего, а что есть — не страшно 🖥Нагрузка на сервер— не выше 20% 💽 Жёсткие диски — расслаблены, курят бамбук

Мы прыгали с бубном вокруг сервера, но: — эмуляция нагрузки не даёт сбоя — API отвечает — тестовый стенд работает как часы

Железо и нагрузка тут не при чём.

Так мы жили пару месяцев, перебирав все мыслимые и немыслимые варианты 🧠

Пока однажды...

В access.log заметили, что часть трафика отбраковывается с ошибкой 403 ❌ Причина — попытка инъекции вредоносного кода. С одной стороны — хорошо: злоумышленник не пробрался 👮‍♂️ С другой — странно. Кто именно блокирует?

Выяснилось: проактивный фильтр Битрикса. Стало интересно. Копаем глубже ⛏️

Симулируем атаку: подставляем «вредный» код в URL и… ловим бан от Битрикса. Фронт частично перестаёт работать. Вот оно! 🧩

Ключевое слово — частично. Nuxt всё ещё может отдавать пререндеренные страницы, но при любом запросе к API — ошибка. Например, с главной всё работает, а если обновить страницу — бах, и ошибка.

Но и это ещё не всё. Поскольку фронт и бэкенд живут на одной машине, они общаются через 127.0.0.1 и IP сервера. Проактивный фильтр не различает, кто есть кто — и блокирует весь IP, включая самого себя.

🚫 Вуаля: фронт частично недоступен, API под блоком. 🔥 Причём инициатором бана оказался... он сам 🤦

P.S. Решение «сложить фронт и бэкенд на один сервер и один домен» — не наше, так что не кидайтесь тапками 👟

Вывод: Если фронт начинает вести себя странно, а логи делают вид, что ничего не происходит — копайте в неожиданное. Проактивная защита — это круто, но ни когда она душит проект который защищает.

Самооборона с гейзенбагом 🥋
💡 Гейзенбаг (Heisenbug) — это такой баг, который исчезает или меняет поведение, как только ты пытаешься его исследовать. Смотришь — и он уже ведёт себя по-другому | Сетка — социальная сеть от hh.ru