Защита webhook-уведомлений
Безопасная обработка webhook-уведомлений от YooKassa
Webhook-уведомления от YooKassa используются для асинхронного оповещения вашего сервера о событиях, таких как изменение статуса платежа или возврата.
Так как webhook - это публичный HTTP-эндпоинт, его обязательно необходимо защищать, чтобы исключить поддельные запросы и попытки атак.
Модуль nestjs-yookassa предоставляет готовое решение для защиты webhook-эндпоинтов.
Почему webhook нужно защищать
Без проверки подлинности злоумышленник может:
- подделать успешный платёж;
- отправить фальшивое уведомление о возврате;
- нарушить бизнес-логику приложения;
- вызвать повторную обработку платежей.
YooKassa официально рекомендует проверять подлинность webhook-уведомлений по IP-адресу отправителя и актуальному статусу объекта.
Как работает защита в nestjs-yookassa
В SDK реализован специальный Guard, который:
- проверяет IP-адрес запроса по официальному whitelist YooKassa;
- поддерживает IPv4, IPv6 и CIDR-диапазоны;
- корректно работает за Nginx, Cloudflare и другими прокси;
- блокирует любые запросы не от YooKassa с ошибкой
403 Forbidden.
Для удобства используется декларативный декоратор.
ВАЖНО: настройка trust proxy
Если ваше приложение работает за прокси-сервером (Nginx, Docker, Kubernetes, Cloudflare и т.д.), обязательно включите доверие к прокси.
Без этого NestJS не сможет корректно определить IP-адрес клиента, и все webhook-запросы будут отклоняться.
Пример настройки
async function bootstrap() {
const app = await NestFactory.create(AppModule)
// Обязательно для корректной работы IP-проверки webhook
app.set('trust proxy', true)
await app.listen(3000)
}Использование декоратора YookassaWebhook
Для защиты эндпоинта достаточно добавить декоратор @YookassaWebhook().
import { Controller, Post, Body } from '@nestjs/common'
import { YookassaWebhook } from 'nestjs-yookassa'
@Controller('webhooks')
export class WebhooksController {
@Post('yookassa')
@YookassaWebhook()
handleWebhook(@Body() event: any) {
// event.object.status
// event.object.id
}
}Декоратор автоматически:
- подключает Guard;
- проверяет IP-адрес отправителя;
- блокирует неавторизованные запросы.
Какие IP-адреса считаются доверенными
Используется официальный список IP-адресов YooKassa:
185.71.76.0/27185.71.77.0/2777.75.153.0/2577.75.154.128/2577.75.156.1177.75.156.352a02:5180::/32
Рекомендуемые дополнительные проверки
Для максимальной безопасности YooKassa рекомендует:
- проверять актуальный статус объекта через API;
- не доверять данным webhook без серверной валидации;
- игнорировать повторные или устаревшие события.
Пример сценария:
- Получили webhook
- Проверили IP
- Запросили объект через API YooKassa
- Сравнили статус
- Только после этого обновили данные в базе