Webhook security: подпись и валидация, без которой postback легко подменить
Если webhook принимается без проверки, любой внешний запрос может сымитировать конверсию, лид или депозит. Базовый минимум — проверять три слоя: источник, подпись, содержимое.
— Источник: разрешай только нужные IP/ASN или хотя бы сетевой allowlist у прокси/файрвола.
— Подпись: HMAC по raw body с общим секретом, сравнение только в constant-time.
— Содержимое: проверяй timestamp, nonce/id запроса, обязательные поля и типы значений.
Частая ошибка — парсить JSON до проверки подписи и потом подписывать уже преобразованный объект. Подпись считают по исходному телу запроса, без нормализации, лишних пробелов и перестановки ключей. Если у тебя form-data или query string, фиксируй канонический формат заранее, иначе валидация будет ломаться на пустяках.
Отдельно следи за replay: один и тот же payload не должен засчитываться дважды. Для этого храни обработанные event_id или request_id с TTL и отклоняй повтор. Если webhook идёт через ретраи, делай обработку идемпотентной: один event = одна запись, повторный запрос = 200 OK без дубля в БД.
Практика простая: сначала verify, потом parse, потом apply. Если какой-то слой не проходит — логируй причину, но не раскрывай секреты и полные payload'ы в открытых логах.
Tracker Lab
@tracker_lab
Webhook security: подпись и валидация, без которой postback легко подменить
Этот пост опубликован в Telegram-канале Tracker Lab. Подписаться можно по ссылке: @tracker_lab.