24 lines
1.0 KiB
Python
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)
|