Files

24 lines
1.0 KiB
Python

"""Проверка адресов 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)