# Исправления безопасности от 4 августа 2026

## Исправлено кодом

- [x] Relay Telegram → OkoCRM не запускается без обязательного секретного
  заголовка.
- [x] Ответы из менеджерской группы разрешены только Telegram ID из allowlist и
  только как reply на сообщение, ранее сохранённое backend.
- [x] Телефон из заявки больше не изменяет подтверждённый Telegram-контакт.
- [x] Добавлено отдельное поле `verifiedPhoneNumber`; миграция переносит в него
  ранее подтверждённые номера.
- [x] Первичная привязка OkoCRM требует совпадения с локальным сообщением,
  действительно поставленным в relay. Одно сообщение нельзя использовать
  повторно.
- [x] События другого OkoCRM setting, исходящие сообщения и посторонние типы
  webhook отбрасываются до сохранения полного payload.
- [x] Удалено самостоятельное сопоставление клиента только по тексту сообщения
  или номеру из webhook.
- [x] Каталожные данные экранируются перед вставкой в DOM; URL изображений
  ограничены безопасными протоколами.
- [x] WordPress сначала декодирует HTML entities, затем удаляет HTML.
- [x] Для Mini App добавлены CSP, HSTS, nosniff, Referrer-Policy и
  Permissions-Policy.
- [x] Пользовательские API-ответы получают `Cache-Control: no-store`.
- [x] Лимит защищённого API считается по Telegram-пользователю, а не только по
  общему IP Telegram WebView.
- [x] Срок Telegram initData по умолчанию уменьшен до 15 минут.

## Обязательные действия при релизе

- [ ] Задать `TELEGRAM_MANAGER_USER_IDS` для владельца и разрешённых
  менеджеров.
- [ ] Установить `TELEGRAM_INIT_DATA_MAX_AGE_SECONDS=900`.
- [ ] Установить `TELEGRAM_FORWARD_WEBHOOK_SECRET`; если OkoCRM не подтверждает
  проверку этого заголовка, очистить `TELEGRAM_FORWARD_WEBHOOK_URL` и работать
  через защищённую резервную группу/админку.
- [ ] Применить миграцию `20260804190000_security_hardening`.
- [ ] Установить Nginx-конфигурацию с `access_log off` для OkoCRM webhook.
- [ ] Сменить `OKOCRM_WEBHOOK_TOKEN` в ENV и настройках OkoCRM.
- [ ] Удалить или ротировать старые access logs, содержащие предыдущий токен.
- [ ] Проверить: `/start`, передачу контакта, обычный чат, ответ менеджера,
  заявку экскурсии, трансфер и план отдыха.

## Остаточный внешний риск

Публичный endpoint OkoCRM ранее принимал искусственные Telegram update без
доказательства их происхождения. Полностью устранить это на стороне
ThaiForTravel невозможно: принимающая сторона должна проверять secret header
или подпись. До письменного подтверждения OkoCRM безопасный режим — отключённый
raw relay с сохранением общения в Telegram-группе и собственной админке.
