/
systemsstrategyy
/
Treker
Обзор
Документация
Войти
/
systemsstrategyy
/
Treker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
api/modules/billing/security.py
40 строк
2 KB
SystemsStrategy
Initial import
02 июл 2026, 15:15
02 июл 2026, 15:15
9624ed1
Код
Авторство
О чём код?
"""IP-валидация webhook'а от ЮKassa. ⚠️ У ЮKassa **нет HMAC** на webhook'ах — это специфика их API. Защиты от подделки 'payment.succeeded' от произвольного хоста: 1. IP allow-list (этот файл) — проверяем что source_ip из официальных диапазонов ЮKassa, опубликованных в их документации. 2. Re-fetch через `Payment.find_one()` — берём status из ответа API, а не из тела webhook (см. WebhookService). Список IP — в settings.yookassa.trusted_ips (Coding_Principles_v1.1 §10). """ from __future__ import annotations import ipaddress from api.core.settings import get_settings def is_yookassa_ip(request_ip: str) -> bool: """Проверяет что IP отправителя webhook принадлежит ЮKassa. Поддерживает IPv4 и IPv6 (у ЮKassa есть 2a02:5180::/32). Невалидный формат IP возвращает False, не исключение — атакующий не должен ронять handler некорректным значением. """ try: ip = ipaddress.ip_address(request_ip) except (ValueError, TypeError): return False for net_str in get_settings().yookassa.trusted_ips: try: network = ipaddress.ip_network(net_str) except ValueError: # Битый CIDR в конфиге — пропускаем, не валим handler. continue if ip in network: return True return False