Материал

Вебхуки и входящие уведомления: как не доверять внешнему событию вслепую

Любой POST-запрос на открытый эндпоинт — это потенциальная угроза. Как именно выстроить оборону: от проверки подписи до изоляции обработки.

Почему вебхук — это не просто удобство

Вебхуки стали стандартным способом интеграции между сервисами. Stripe сообщает об успешной оплате. GitHub уведомляет о push. Slack пишет о новом сообщении. Кажется, всё просто: внешний сервис отправляет событие, вы его обрабатываете.

Но за этой простотой скрыта принципиальная архитектурная проблема: вебхук — это входящий HTTP-запрос из интернета на публичный URL. Никакого рукопожатия. Никакой сессии. Никакой взаимной аутентификации по умолчанию. Ваш сервер буквально принимает POST от неизвестного отправителя и доверяет содержимому.

Классический антипаттерн выглядит так [1]:

POST /api/webhooks/payment
Body: { "status": "paid", "amount": 9999 }
→ issueLicense()

Если такой эндпоинт открыт без верификации — любой может вызвать issueLicense(). По данным отраслевых опросов, 78% SaaS-платформ уже имеют вебхук-эндпоинты с объёмом обработки свыше 2 миллионов запросов в месяц, при этом только 30% организаций внедрили защиту от replay-атак [2].

Для CTO, Tech Lead и AppSec-инженера вопрос звучит так: как правильно выстроить слои контроля, чтобы входящее событие от внешнего сервиса обрабатывалось безопасно — без blind trust, без лишнего шума, без даунтайма при ротации ключей?


Что такое вебхук с точки зрения безопасности

Вебхук — это reverse API: внешний сервис сам инициирует запрос к вашему эндпоинту при наступлении события [3]. Это принципиально меняет модель угроз по сравнению с традиционным API, где вы сами контролируете, когда и к кому обращаетесь.

С точки зрения безопасности у вебхука три ключевые характеристики:

Во-первых, он публично доступен. URL вебхука — это открытый эндпоинт в интернете, доступный любому, кто его знает.

Во-вторых, отправитель не аутентифицирован по умолчанию. В отличие от mTLS-соединений или OAuth-токенов, вебхук по умолчанию не требует взаимной идентификации.

В-третьих, пейлоад передаётся как данные. Содержимое события — это данные из внешней системы, которые могут содержать вредоносные строки, инъекции, ссылки на внутренние адреса и другие угрозы.

OWASP API Security Top 10 2023 прямо относит вебхуки к категории API-эндпоинтов, на которые распространяются все соответствующие требования безопасности: API2:2023 (Broken Authentication) и API8:2023 (Security Misconfiguration) [4]. Новая категория API10:2023 (Unsafe Consumption of APIs) специально выделяет риск слепого доверия данным от третьих сторон [5].

Основные векторы атак

Подделка запроса (Forged Request)

Самый базовый вектор. Злоумышленник отправляет POST на ваш webhook-эндпоинт, имитируя легитимное событие. Реальный пример: в 2023 году атакующие воспользовались вебхуком криптовалютной биржи без верификации подписи и подтвердили фиктивные депозиты, похитив более 2 миллионов долларов [1].

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

Replay-атака

Атакующий перехватывает валидный подписанный запрос и отправляет его повторно. Подпись корректна — сервер принимает событие как новое. Если обработчик не идемпотентен, платёж начисляется дважды, заказ выполняется повторно, привилегия выдаётся снова [6].

Важно понимать разницу: HMAC-подпись защищает от подделки, но не от переиспользования. Перехваченный и повторно отправленный запрос с валидной подписью пройдёт верификацию без дополнительных механизмов защиты.

SSRF через вебхук (Server-Side Request Forgery)

Если ваша система позволяет пользователям задавать URL для отправки вебхуков — возникает SSRF-риск. Атакующий указывает внутренний адрес (например, http://169.254.169.254/ для получения AWS-метаданных или http://localhost:6379/ для Redis), и ваш сервер сам делает запрос к этому адресу [7].

Реальные CVE в этой категории: CVE-2024-52588 (Strapi CMS) — аутентифицированный SSRF в модуле вебхуков, позволявший сканировать внутренние порты через localhost-адреса [7]. GitHub-репозитории фиксируют аналогичные проблемы в Squidex, Zammad и других платформах [8].

Инъекции через данные пейлоада

Подпись подтверждает отправителя — но не безопасность содержимого. Даже если вебхук пришёл от легитимного провайдера, в пейлоаде могут находиться данные, введённые злоумышленником на стороне провайдера [9]:

  • Поле metadata.city_name содержит SQL-инъекцию, введённую при оформлении заказа.
  • Поле username содержит шаблонную инъекцию для движка рендеринга.
  • Поле callback_url содержит SSRF-payload.

Уязвимость такого типа была задействована в инциденте с MOVEit в 2024 году, затронувшем более 2000 организаций через недостаточную валидацию входных данных в обработчиках [1].

Петли и шторм ретраев

Вебхук-провайдеры повторяют доставку при получении ошибки (не-2xx ответ). Если ваш обработчик упал во время деплоя и начал возвращать 500 — провайдер запустит серию ретраев. Это накладывается на обычный трафик и может перегрузить сервис в момент восстановления [10].

Петли случаются при неправильной конфигурации: вебхук триггерит действие, которое снова генерирует событие — и так по кругу, тысячи запросов в минуту [10].

Уровень первый: верификация подписи

Как работает HMAC-подпись

Стандартный подход, используемый GitHub, Stripe, Shopify и большинством зрелых вебхук-провайдеров [11]:

  1. Провайдер и получатель заранее согласовывают shared_secret — случайную строку с высокой энтропией.
  2. При отправке события провайдер вычисляет HMAC-SHA256 от тела запроса с использованием секрета и помещает результат в заголовок (например, X-Hub-Signature-256 или X-Stripe-Signature).
  3. Получатель берёт сырое тело запроса (raw body, до парсинга JSON), вычисляет HMAC-SHA256 с тем же секретом и сравнивает с переданным значением.

Ключевой момент: верификация выполняется на raw bytes, до любого парсинга [12]. Если вы сначала парсите JSON, а потом пытаетесь верифицировать — подпись сломается, потому что сериализация JSON не гарантирует побайтовую идентичность.

Timing-safe сравнение

Обычное сравнение строк уязвимо к timing-атакам: разное время сравнения символ за символом позволяет по статистике восстановить ожидаемое значение. Используйте crypto.timingSafeEqual (Node.js), hmac.compare_digest (Python) или аналоги в вашем языке [12].

Что делать при несовпадении

Ответ 401 Unauthorized. Логировать IP, заголовки, timestamp. Не обрабатывать пейлоад. Без исключений [12].

Уровень второй: защита от replay-атак

Timestamp + окно допуска

Провайдер включает timestamp в подпись (например, в заголовке X-Timestamp). Получатель:

  1. Извлекает timestamp из заголовка.
  2. Проверяет, что запрос пришёл не позднее чем now - 5 минут [2].
  3. Включает timestamp в вычисление HMAC вместе с телом запроса, чтобы атакующий не мог подделать timestamp.

5 минут — отраслевой стандарт: достаточно, чтобы допустить сетевые задержки и расхождение часов, и достаточно мало, чтобы ограничить окно атаки [2]. Серверы должны синхронизироваться по NTP [13].

Идемпотентность по event ID

Провайдеры (GitHub, PayPal, Stripe и другие) включают уникальный идентификатор события. Получатель сохраняет обработанные event ID в базе или кэше и отклоняет дубли [13]:

  • Timestamp закрывает replay-окно по времени.
  • Идемпотентность закрывает replay-риск внутри окна и защищает от законных ретраев провайдера.

Это два дополняющих механизма, а не взаимозаменяемых [2].

Уровень третий: валидация пейлоада

Подпись подтверждает отправителя. Это не означает, что содержимое безопасно [9].

После успешной верификации:

  • Валидировать структуру по JSON Schema — отклонять всё, что не соответствует ожидаемой схеме.
  • Санитизировать строки перед использованием в SQL-запросах, шаблонах, командах.
  • Проверять числовые значения на допустимые диапазоны.
  • Не доверять URL из пейлоада — проверять их на принадлежность к разрешённым доменам перед выполнением запроса [1].
  • Отклонять поля с неожиданными типами данных (например, массив там, где ожидается строка).

Типовой workflow обработки входящего вебхука [14]:

Входящий запрос
→ [ШАГ 1] Верифицировать подпись → FAIL → 401
→ [ШАГ 2] Проверить timestamp → FAIL → 400
→ [ШАГ 3] Проверить идемпотентность → DUP → 200 OK (игнор)
→ [ШАГ 4] Поставить в очередь
→ Немедленно вернуть 200 OK

Уровень четвёртый: асинхронная обработка

Вебхук-провайдеры ждут ответ ограниченное время: Stripe — 30 секунд, GitHub — 10, большинство других — от 5 до 30 [15]. Превышение таймаута приводит к повторной попытке.

Правило: принял → верифицировал → поставил в очередь → вернул 200 [16].

Бизнес-логика — в воркере, а не в обработчике запроса. Это даёт:

  • Стабильное время ответа независимо от нагрузки.
  • Возможность обрабатывать пиковые нагрузки без потерь.
  • Изоляцию сбоев: упавший воркер не приводит к потере события при наличии очереди с at-least-once гарантией.

Очередь должна быть durable (Redis Streams, SQS, RabbitMQ, Kafka) — чтобы событие не потерялось при рестарте воркера [17].

Уровень пятый: защита от SSRF в webhook-конфигурации

Если ваша платформа позволяет пользователям задавать URL для вебхука — вы должны валидировать адрес назначения на стороне сервера перед любым запросом:

  • Запрещать loopback-адреса (127.0.0.1, ::1).
  • Запрещать link-local адреса (169.254.0.0/16, AWS metadata endpoint).
  • Запрещать RFC 1918 диапазоны (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16).
  • Валидировать не до DNS-резолвинга, а после — DNS rebinding позволяет обойти проверку до резолвинга [10].

Критически важно: валидация только схемы (http/https) и имени хоста недостаточна. Уязвимость в Zammad была именно в этом — проверялась только схема и хост, но не resolving-адрес, что позволяло обращаться к loopback-интерфейсам [8].

Ротация секретов: без даунтайма

Секрет нужно ротировать. Причины: компрометация, плановая политика, инцидент у провайдера.

Наивная смена: поменял секрет → все вебхуки в transit с прежним секретом начнут падать → даунтайм.

Правильная схема — grace-период с двойной верификацией [18]:

  1. Генерируешь новый секрет.
  2. Обновляешь хендлер: сначала проверяешь новым секретом, если не совпало — проверяешь старым. Логируешь, каким секретом прошла верификация.
  3. Обновляешь секрет у провайдера. Некоторые провайдеры сами поддерживают одновременную отправку двух подписей в заголовке (как Svix, OrangeLogic) [18][19].
  4. Следишь за логами: трафик должен постепенно переходить на новый секрет.
  5. Через grace-период (обычно 1–24 часа в зависимости от сложности интеграций) убираешь поддержку старого секрета.

Секреты должны храниться в secrets management системах (AWS Secrets Manager, HashiCorp Vault), а не в переменных окружения на сервере или, хуже, в коде [20].

IP-allowlisting: дополнение, не замена

Белый список IP-адресов провайдера — полезный дополнительный слой, но не основной контроль:

  • Stripe, GitHub, Shopify публикуют списки своих IP — можно использовать на WAF/Nginx уровне, чтобы срезать мусорный трафик до проверки HMAC [21].
  • IP-адреса провайдеров меняются. Slack и многие другие не публикуют стабильных allowlist — используют динамические диапазоны [2].
  • IP можно подделать на уровне сети. HMAC подделать нельзя без секрета.

Правило: IP allowlisting — это фильтр на входе, HMAC-верификация — это гарантия аутентичности [11].

Rate limiting и защита от петель

Ограничение по частоте запросов защищает от двух разных угроз:

Во-первых, replay-атак с высокой частотой: даже если атакующий нашёл способ переслать валидный подписанный запрос внутри окна 5 минут, rate limiting ограничит ущерб.

Во-вторых, петель и ретрай-штормов: если провайдер начал ретраить из-за ваших 500-ошибок, rate limiting на уровне source IP сдержит поток [10].

Настройка лимита требует внимания: Stripe может отправить несколько сотен событий за секунды в момент массовых операций (например, миграции подписок). Лимит должен учитывать легитимные пики [10].

Реальный инцидент: GitHub webhook secret exposure (2025–2026)

В апреле 2026 года GitHub уведомил пользователей о серьёзном инциденте: с сентября 2025 по январь 2026 года баг в новой версии платформы доставки вебхуков приводил к тому, что webhook secrets включались в HTTP-заголовок X-Github-Encoded-Secret и отправлялись вместе с пейлоадом получателям [22].

Секрет был закодирован в base64 — тривиально обратимо. Если системы получателей логировали HTTP-заголовки (Datadog, New Relic, Sentry, API-шлюзы), секрет оседал в логах [23].

Последствие: атакующий с доступом к логам мог получить секрет и начать подделывать webhook-события от имени GitHub: форжить пуши, события релизов, изменения в репозиториях — всё, на что подписан вебхук [24].

GitHub зафиксировал отсутствие доказательств фактической эксплуатации, но рекомендовал ротировать все затронутые секреты и проверить логи на наличие заголовка X-Github-Encoded-Secret [25].

Урок для всех: даже если провайдер надёжен, его инфраструктура может допустить компрометацию секрета. Именно поэтому плановая ротация и мониторинг логов на чувствительные данные — не параноя, а гигиена.

Мониторинг и логирование

Хороший webhook-эндпоинт должен логировать:

  • Каждый входящий запрос: timestamp, IP, event type, event ID, результат верификации подписи.
  • Отклонённые запросы: причина отклонения, сырые заголовки (но без секрета!).
  • Дубликаты: event ID уже обработанных событий.
  • Ретраи: одно событие, полученное несколько раз.

Алерты нужны на:

  • Всплески 401 — возможный брутфорс или компрометация секрета.
  • Появление событий с заголовком X-Github-Encoded-Secret (или аналогичных) в логах.
  • Рост dead letter queue — признак системного сбоя обработчика.
  • Резкий рост объёма входящих событий от одного провайдера — возможный replay-шторм.

Практический чек-лист

Перед деплоем любого webhook-эндпоинта в продакшн:

Аутентификация и целостность

  • Верификация HMAC-подписи на каждом запросе, без исключений — 401 при несовпадении.
  • Использование timing-safe сравнения подписей.
  • Верификация выполняется на raw bytes тела запроса, до JSON-парсинга.
  • Секрет хранится в secrets manager, не в коде и не в переменных окружения без защиты.

Защита от replay

  • Проверка timestamp, отклонение запросов старше 5 минут.
  • Timestamp включён в вычисление HMAC.
  • Хранение и проверка event ID для идемпотентности.
  • Синхронизация серверного времени по NTP.

Валидация пейлоада

  • JSON Schema валидация структуры и типов полей.
  • Санитизация строк перед использованием в запросах.
  • Проверка числовых диапазонов.
  • Валидация URL из пейлоада перед выполнением запросов.

Инфраструктура

  • Только HTTPS на эндпоинте, HTTP отклонять.
  • Rate limiting с учётом легитимных пиков.
  • IP allowlisting как дополнительный слой (если провайдер публикует диапазоны).
  • Ответ 200 возвращается немедленно, бизнес-логика — в очереди.

Операционная безопасность

  • Плановая ротация секретов с grace-периодом.
  • Логирование без секретов в заголовках.
  • Алерты на аномалии (всплеск 401, рост DLQ).
  • Автоматические тесты: невалидная подпись, устаревший timestamp, дубль event ID, oversized payload — все должны отклоняться.

Типичные ошибки

Парсинг JSON до верификации. Многие фреймворки по умолчанию парсят тело запроса в middleware. После этого raw body недоступен — верификация невозможна. Нужно сохранять raw bytes отдельно [26].

Хранение секрета в URL. /webhooks?token=mysecret — секрет попадает в логи Nginx, Cloudflare, ALB. Никогда не передавать секрет в URL [27].

Игнорирование timestamp внутри подписи. Если timestamp не включён в HMAC, атакующий может подменить его на свежий — и replay пройдёт [13].

IP allowlisting как единственный контроль. IP легко подделать. Без HMAC это не защита.

Синхронная обработка тяжёлой логики. Email, запросы к базе, API-вызовы — всё это до возврата ответа. Таймаут → ретрай → дубль события [28].

Одинаковый секрет для всех сред. Prod, staging, dev должны иметь разные секреты. Иначе компрометация в dev ставит под угрозу prod [29].

Тренды и будущее

Отрасль движется от shared secret к асимметричным схемам. PayPal использует асимметричное шифрование для невозможности отрицания (non-repudiation): провайдер подписывает приватным ключом, получатель верифицирует публичным [30]. Это устраняет проблему компрометации shared secret, поскольку приватный ключ остаётся только у провайдера.

Вторая тенденция — mTLS (mutual TLS): взаимная аутентификация на уровне транспорта требует сертификатов с обеих сторон [3]. Сложнее в управлении, но даёт более сильную гарантию.

Стандарт webhooks.fyi фиксирует лучшие практики и рекомендует включение timestamp в HMAC, публикацию полной спецификации аутентификации провайдером, поддержку ротации ключей с нулевым даунтаймом [30].

Рост количества AI-сгенерированного кода в обработчиках вебхуков добавляет новый риск: модели нередко генерируют «рабочий» обработчик без верификации подписи, без timing-safe сравнения, с синхронной обработкой. Код запускается, интеграция работает — но безопасность отсутствует. Именно поэтому security-ревью изменений в обработчиках вебхуков важно не откладывать до аудита, а встраивать в процесс code review.

Здесь уместен контроль на уровне pull request: HighVibe анализирует конкретные изменения в коде и конфигурации — включая webhook handlers — и может отметить отсутствие верификации подписи, небезопасное сравнение, отсутствие rate limiting или хранение секрета в коде до того, как изменение уйдёт в prod.

Заключение

Вебхуки — не просто удобный паттерн интеграции. Это точка входа в ваш сервис из интернета. Без контроля — это открытая дверь.

Слои защиты выстраиваются последовательно: HMAC-верификация закрывает forged requests, timestamp + окно допуска закрывают replay, идемпотентность закрывает дубли от ретраев, JSON Schema валидация закрывает инъекции из пейлоада, SSRF-защита закрывает атаки через URL в конфигурации, асинхронная обработка закрывает ретрай-штормы.

Ни один из этих слоёв не заменяет другой. Вместе они делают webhook-эндпоинт сложной мишенью, а не мягкой точкой входа.

Источники

[1] APIsec — "Securing Webhook Endpoints: Authentication and Validation Best Practices" — https://www.apisec.ai/blog/securing-webhook-endpoints-best-practices

[2] InventiveHQ — "Webhook Security Implementation Workflow" — https://inventivehq.com/blog/webhook-security-implementation-workflow

[3] Stytch — "Webhooks security best practices" — https://stytch.com/blog/webhooks-security-best-practices/

[4] Practical DevSecOps — "OWASP API Security Top 10: 2023 Update Explained" — https://www.practical-devsecops.com/owasp-api-security-top-10/

[5] ApyGuard — "OWASP API Security Top 10 (2023): Every Vulnerability Explained" — https://www.apyguard.com/resources/blog/owasp-api-security-top-10

[6] FreelyIT — "Webhook Security: HMAC Signatures and Replay Attack Prevention" — https://www.freelyit.nl/en/blog/api-security-best-practices-2026-03-21

[7] GitHub Security Advisory — "SSRF in Squidex Webhook Rules Engine" — https://github.com/Squidex/squidex/security/advisories/GHSA-wxg2-953m-fg2w

[8] GitHub Security Advisory — "SSRF via webhooks in Zammad" — https://github.com/zammad/zammad/security/advisories/GHSA-2vgc-vfh2-rw75

[9] WebhookWhisper — "Webhook Security Best Practices (payload injection)" — https://webhookwhisper.com/blog/webhook-security-best-practices

[10] DEV Community (digital_trubador) — "Webhook Security Best Practices for Production 2025-2026" — https://dev.to/digital_trubador/webhook-security-best-practices-for-production-2025-2026-384n

[11] Kusari — "Webhook Security: Definition, Explanation & Best Practices" — https://www.kusari.dev/learning-center/webhook-security

[12] CatchHooks — "Webhook Security: Verify Signatures & Protect" — https://www.catchhooks.com/blog/webhook-security-and-signature-verification

[13] Webhooks.fyi — "Replay prevention" — https://webhooks.fyi/security/replay-prevention

[14] Michael K. Laweh — "Webhook Security 101: Why You Should Never Trust an Incoming Payload" — https://www.klytron.com/blog/webhook-security-101-never-trust-payload

[15] Hookdeck — "How to Troubleshoot and Debug Webhooks" — https://hookdeck.com/webhooks/guides/troubleshooting-debugging-webhooks-tutorial

[16] Hookdeck — "Why Implement Asynchronous Processing of Webhooks" — https://hookdeck.com/webhooks/guides/why-implement-asynchronous-processing-webhooks

[17] Hookdeck — "Why You Should Stop Processing Your Webhooks Synchronously" — https://hookdeck.com/webhooks/guides/why-you-should-stop-processing-your-webhooks-synchronously

[18] Svix Blog — "Zero Downtime Secret Rotation for Webhooks" — https://www.svix.com/blog/zero-downtime-secret-rotation-webhooks/

[19] OrangeDAM Docs — "Generate a secret key for a webhook signature" — https://developer.orangelogic.com/reference/add-or-update-a-webhook-signature

[20] Refgrow — "Webhook Security Best Practices" — https://refgrow.com/blog/webhook-security-best-practices

[21] Hooklistener — "Webhook Security Guide: HMAC Signatures & Replay Protection" — https://www.hooklistener.com/learn/webhook-security-fundamentals

[22] BeyondMachines — "GitHub Webhook Secret Exposure: Secrets Leaked in HTTP Headers" — https://beyondmachines.net/event_details/github-webhook-secret-exposure-incident-secrets-inadvertently-leaked-in-http-headers-between-september-2025-and-january-2026-l-j-3-7-t

[23] Sam James Blog — "GitHub Webhook Secret Exposure" — https://www.samdjames.uk/blog/github-webhook-secret-exposure/

[24] BotBeat — "GitHub Notifies Users of Webhook Secret Exposure Bug" — https://botbeat.news/news/github-notifies-users-of-webhook-secret-exposure-bug-urges-secret-rotation-4420

[25] Sam James — "GitHub Webhook Secret Exposure Incident (GH-9951654-7992-a1)" — https://www.samdjames.uk/docs/software/github/gh-9951654-7992-a1/

[26] Hook0 Documentation — "Verify webhook HMAC signatures" — https://documentation.hook0.com/tutorials/webhook-authentication

[27] GitHub Docs — "Best practices for using webhooks" — https://docs.github.com/en/webhooks/using-webhooks/best-practices-for-using-webhooks

[28] DEV Community (deadletter) — "Why Your Webhook Handler Is Silently Failing" — https://dev.to/deadletter/why-your-webhook-handler-is-silently-failing-and-how-to-fix-it-50ah

[29] WebhookWhisper — "Webhook Security Best Practices" — https://webhookwhisper.com/blog/webhook-security-best-practices

[30] Webhooks.fyi — "Best Practices for Webhook Providers" — https://webhooks.fyi/best-practices/webhook-providers

[31] PentestTesting — "Adaptive Webhook Security Best Practices" — https://www.pentesttesting.com/adaptive-webhook-security-best-practices/

[32] Hookdeck — "Webhook Security Vulnerabilities Guide" — https://hookdeck.com/webhooks/guides/webhook-security-vulnerabilities-guide

[33] Akamai — "OWASP Top 10 API Security Risks: The 2023 Edition" — https://www.akamai.com/blog/security/owasp-top-10-api-security-risks-2023-edition

[34] Svix — "Webhook Timeout Best Practices" — https://www.svix.com/resources/webhook-university/reliability/webhook-timeout-best-practices/

Нужен такой же контроль в ваших изменениях и релизах?

Покажем пример такого замечания на вашем сценарии и соберём пилотный контур без лишней суеты.

Запросить пилот Все статьи
Дальше по теме

Ещё материалы

Все статьи
24 июня 2026 18 мин

Политика использования ИИ в команде разработки: как не опоздать, когда всё уже идёт

Если разработчики уже пишут код с ИИ ассистентами, политика нужна сегодня — а не после первого инцидента TL;DR Более 84% разработчиков уже используют или планируют использовать ИИ инструменты 1 , и большинство делают эт…

Открыть материал
23 июня 2026 16 мин

Регистрация и онбординг пользователей: где появляются первые уязвимости

Форма регистрации выглядит просто. За ней скрывается один из наиболее атакуемых периметров приложения. TL;DR Форма регистрации и онбординг флоу — это первая поверхность атаки, которую видит злоумышленник. Большинство уя…

Открыть материал
23 июня 2026 15 мин

Бизнес-логика и мошенничество в продукте: что проверять до запуска

Ваш продукт работает правильно. Но это не значит, что он работает безопасно. TL;DR Уязвимости бизнес логики — это не сломанный код, а сломанные правила: приложение делает именно то, что написано, но не то, что задумывал…

Открыть материал