Каждый раз когда ты принимаешь вебхук без проверки подписи, ты доверяешь любому кто знает твой URL. А URL — не секрет.
Стандартная схема: отправитель берёт тело запроса, подписывает его HMAC-SHA256 с секретным ключом и кладёт подпись в заголовок (X-Signature, X-Hub-Signature-256 — зависит от платформы). Ты на своей стороне делаешь то же самое и сравниваешь результат.
Критически важная деталь: сравнение нужно делать через hmac.compare_digest (Python) или hash_equals (PHP), а НЕ через == или ===. Обычное сравнение уязвимо к timing attack — атакующий может угадать подпись побайтово, замеряя время ответа.
Вторая деталь: проверяй raw body, не распарсенный JSON. После парсинга и сериализации обратно порядок ключей может измениться, и подпись не сойдётся.
Третья: добавляй проверку timestamp из заголовка. Подпись валидна 5 минут — это защита от replay-атак. Старый перехваченный запрос не пройдёт повторно.
Если платформа не поддерживает подписи — минимум: проверяй IP источника против их опубликованного диапазона + используй webhook secret в URL как дополнительный фактор.
Автоматизация на вебхуках
@webhook_automation_hub_arb
HMAC-подпись вебхука: почему «просто принять» — это дыра в безопасности
Этот пост опубликован в Telegram-канале Автоматизация на вебхуках. Подписаться можно по ссылке: @webhook_automation_hub_arb.