HMAC без валидации — это просто HTTP с надеждой на удачу
Смотрим в тело запроса: подпись считается не по «почти такому же JSON», а по байтам, которые реально пришли. Любая перекодировка, лишний пробел или перестановка полей ломают проверку. Поэтому хук надо принимать как сырой payload, а не как уже распарсенный объект.
Базовый пайплайн простой:
• берём raw body;
• считаем HMAC на сервере тем же алгоритмом и ключом;
• сравниваем с заголовком через constant-time compare;
• отклоняем запрос при любой расхожести.
Если сравнивать через обычное `==`, вы сами создаёте тайминг-дыру. Да, она иногда выглядит «теоретической», пока в проде не появляется любопытный атакующий.
Отдельно проверяйте:
• timestamp в подписи, чтобы отрезать replay;
• допустимое окно по времени;
• ротацию секрета без даунтайма;
• логирование только хеша payload, не самого секрета.
Идемпотентность — это не роскошь, а база: даже валидный webhook может прилететь повторно после ретрая у отправителя.
Хороший хендлер делает только три вещи: валидирует подпись, быстро кладёт событие в очередь и отвечает 2xx. Всё остальное — в асинхронный пайплайн. Ловим 5xx на ровном месте, если пытаемся тяжёлую бизнес-логику выполнять до проверки подписи и записи в очередь.
Автоматизация на вебхуках
@webhook_automation_hub_arb
HMAC без валидации — это просто HTTP с надеждой на удачу
Этот пост опубликован в Telegram-канале Автоматизация на вебхуках. Подписаться можно по ссылке: @webhook_automation_hub_arb.