"""Проверка адресов push-сервисов: сервер не должен ходить по произвольным URL, заданным пользователем (SSRF).""" import ipaddress from urllib.parse import urlsplit # Адреса, которые отдают браузеры при подписке (Chrome/Edge/Opera/Samsung — FCM, Firefox, Safari, Windows) ALLOWED_SUFFIXES = (".googleapis.com", ".push.services.mozilla.com", ".push.apple.com", ".notify.windows.com") def is_allowed_push_endpoint(url: str) -> bool: try: p = urlsplit(url) host = (p.hostname or "").lower() port = p.port except ValueError: return False if p.scheme != "https" or not host or p.username or p.password or port not in (None, 443): return False try: ipaddress.ip_address(host) return False # IP-адреса (в том числе локальные) не допускаем except ValueError: pass return any(host.endswith(s) for s in ALLOWED_SUFFIXES)