Skip to content
EN

Webhook signing

Коротко:

Webhook signing — механизм, при котором sender добавляет HMAC-подпись payload в HTTP header, receiver проверяет подпись по shared secret. Без signing любой, кто знает webhook URL, может отправить fake events. Стандартный pattern: HMAC-SHA256(secret, timestamp + body) → header X-Hub-Signature-256. Используется в Stripe, GitHub, Telegram, YooKassa, Slack.

Ниже: подробности, пример, смежные термины, FAQ.

Проверить безопасность сайта →

Подробности

  • HMAC algorithm: SHA-256 (стандарт). SHA-1 deprecated
  • Payload: обычно включает timestamp для replay protection
  • Header name: не унифицировано — X-Signature, X-Hub-Signature-256, Stripe-Signature
  • Timing-safe comparison: hash_equals() в PHP, crypto.timingSafeEqual() в Node
  • Secret rotation: provider даёт grace period — валидны 2 secrets одновременно

Пример

// PHP verification
$expected = hash_hmac("sha256", $body, $secret);
$actual = $_SERVER["HTTP_X_SIGNATURE_256"];
if (!hash_equals($expected, $actual)) return 401;

Смежные термины

Что такое HMAC подпись для Webhook?

HMAC подпись (Hash-based Message Authentication Code) используется для проверки целостности и подлинности данных, отправляемых через вебхуки. Она обеспечивает защиту от подделки сообщений, позволяя получателю удостовериться, что данные действительно были отправлены авторизованным источником. Для создания HMAC подписи используется секретный ключ и хэш-функция (например, SHA-256), что делает этот метод надежным для обеспечения безопасности вебхуков.

Как настроить HMAC подпись для вебхуков?

Для настройки HMAC подписи в вашем приложении, выполните следующие шаги:

  1. Сгенерируйте секретный ключ: Используйте надежный генератор случайных чисел для создания уникального ключа, который будет использоваться для подписи. Например, в командной строке:
openssl rand -base64 32
  1. Создайте HMAC подпись: При отправке вебхука, создайте подпись, используя ваш секретный ключ и данные сообщения. Пример на Python:
import hmac
import hashlib

def create_hmac_signature(secret, data):
    return hmac.new(secret.encode(), data.encode(), hashlib.sha256).hexdigest()
  1. Отправьте вебхук: Включите HMAC подпись в заголовок вашего HTTP-запроса. Пример:
import requests

url = 'https://example.com/webhook'
data = '{"event":"order_created"}'
secret = 'ваш_секретный_ключ'
sig = create_hmac_signature(secret, data)
headers = {'X-Hub-Signature': sig}

response = requests.post(url, data=data, headers=headers)

Таким образом, получатель сможет проверить подпись, используя тот же секретный ключ.

Проверка HMAC подписи на стороне получателя

При получении вебхука, важно проверить HMAC подпись, чтобы удостовериться в подлинности сообщения. Вот как это можно сделать:

  1. Извлеките HMAC подпись из заголовка: Получите значение, отправленное в заголовке, например, X-Hub-Signature.
received_signature = request.headers.get('X-Hub-Signature')
  1. Создайте HMAC подпись с теми же данными: Используйте тот же секретный ключ и данные, которые были отправлены в вебхуке, для создания новой подписи.
calculated_signature = create_hmac_signature(secret, request.data.decode())
  1. Сравните подписи: Проверьте, совпадают ли полученная и вычисленная подписи. Если они совпадают, данные подлинны.
if hmac.compare_digest(received_signature, calculated_signature):
    print('Подпись верна, сообщение подлинно')
else:
    print('Подпись неверна, возможно подделка')

Использование hmac.compare_digest важно для предотвращения атак на время, так как оно сравнивает строки безопасным способом.

ЗаголовкиCSP, HSTS, X-Frame-Options и др.
SSL/TLSШифрование и сертификат
КонфигурацияСерверные настройки и утечки
Оценка A-FОбщий балл безопасности

Почему нам доверяют

OWASP
рекомендации
15+
заголовков безопасности
<2с
результат
A–F
оценка безопасности

Как это работает

1

Введите URL сайта

2

Анализ заголовков безопасности

3

Получите оценку A–F

Что проверяет анализ безопасности?

Инструмент проверяет HTTP-заголовки безопасности, конфигурацию SSL/TLS, утечки серверной информации и защиту от распространённых атак (XSS, clickjacking, MIMEsniffing). Оценка от A до F показывает общий уровень защиты.

Анализ заголовков

Проверка Content-Security-Policy, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy и других.

Проверка SSL

Версия TLS, срок сертификата, цепочка доверия, поддержка HSTS.

Обнаружение утечек

Поиск раскрытых серверных версий, debug-режимов, открытых конфигов и директорий.

Отчёт с рекомендациями

Детальный отчёт с объяснением каждой проблемы и конкретными шагами для исправления.

Кому это нужно

Специалисты по безопасности

аудит HTTP-заголовков

DevOps

проверка конфигурации

Разработчики

CSP и HSTS настройка

Аудиторы

соответствие стандартам

Частые ошибки

Нет Content-Security-PolicyCSP — главная защита от XSS. Без него инъекция скриптов значительно проще.
Нет заголовка HSTSБез HSTS возможна downgrade-атака с HTTPS на HTTP. Включите Strict-Transport-Security.
Server header раскрывает версиюServer: Apache/2.4.52 помогает атакующим подобрать эксплойт. Скройте версию.
X-Frame-Options не установленСайт можно встроить в iframe для clickjacking-атаки. Установите DENY или SAMEORIGIN.
Нет X-Content-Type-OptionsБез nosniff браузер может интерпретировать файлы неправильно (MIME sniffing).

Лучшие практики

Начните с базовых заголовковМинимум: HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy. Займёт 5 минут.
Внедрите CSP постепенноНачните с Content-Security-Policy-Report-Only, мониторьте нарушения, затем включите.
Скройте серверные заголовкиУдалите Server, X-Powered-By, X-AspNet-Version из ответов.
Настройте Permissions-PolicyОграничьте доступ к камере, микрофону, геолокации — только то, что реально используется.
Проверяйте после каждого деплояЗаголовки безопасности могут быть перезаписаны при обновлении конфигурации сервера.

Получите больше с бесплатным аккаунтом

История security-проверок и мониторинг HTTP-заголовков безопасности.

Зарегистрироваться (FREE)

Больше по теме

Часто задаваемые вопросы

Почему HMAC а не просто shared secret в header?

Secret в header = посланный в plain. HMAC подписывает body, secret не передаётся по сети.

Replay attack защита?

Timestamp + nonce в payload. Receiver проверяет что timestamp свежий (5 min window) и nonce не использован.

Какие providers используют?

Stripe (Stripe-Signature), GitHub (X-Hub-Signature-256), Slack (X-Slack-Signature), Telegram (X-Telegram-Bot-Api-Secret-Token), YooKassa.

Запустить инструмент, который описан в этой статье

Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.