Портал технической службы: наряды и чек-листы, задачи, отказы и неисправности, анализ надёжности, карты, склады, приложение для Android
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
"""Проверка адресов 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)
|
||||
Reference in New Issue
Block a user