Токен и расшифровки разговоров ходили по сети открытым текстом. Теперь в пакете лежит Caddy: он держит сертификаты Let's Encrypt и продлевает их сам, а сервис уходит на localhost. Отдельно решён вопрос подмены адреса: за прокси все запросы приходят с localhost, и список разрешённых адресов пускал бы кого угодно. Заголовку с настоящим адресом сервис верит только от доверенного прокси - на это восемь тестов. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
45 lines
2.2 KiB
Python
45 lines
2.2 KiB
Python
"""Тесты определения адреса клиента за обратным прокси.
|
|
|
|
Caddy держит HTTPS и проксирует запросы на localhost. Без учёта
|
|
X-Forwarded-For список разрешённых адресов увидит вместо клиента localhost
|
|
и пустит кого угодно. Но доверять заголовку можно только от самого прокси -
|
|
иначе его подделает любой желающий.
|
|
"""
|
|
import pytest
|
|
|
|
from app.security import client_address, parse_allowlist
|
|
|
|
|
|
class TestClientAddress:
|
|
def test_direct_connection_uses_peer(self):
|
|
assert client_address("203.0.113.5", None, parse_allowlist("")) == "203.0.113.5"
|
|
|
|
def test_forwarded_header_used_from_trusted_proxy(self):
|
|
trusted = parse_allowlist("127.0.0.1")
|
|
assert client_address("127.0.0.1", "203.0.113.5", trusted) == "203.0.113.5"
|
|
|
|
def test_forwarded_header_ignored_from_untrusted_peer(self):
|
|
"""Подделка заголовка не должна давать доступ."""
|
|
trusted = parse_allowlist("127.0.0.1")
|
|
assert client_address("198.51.100.9", "10.0.0.1", trusted) == "198.51.100.9"
|
|
|
|
def test_takes_first_address_from_chain(self):
|
|
trusted = parse_allowlist("127.0.0.1")
|
|
assert client_address("127.0.0.1", "203.0.113.5, 70.41.3.18", trusted) == "203.0.113.5"
|
|
|
|
def test_empty_header_falls_back_to_peer(self):
|
|
trusted = parse_allowlist("127.0.0.1")
|
|
assert client_address("127.0.0.1", "", trusted) == "127.0.0.1"
|
|
|
|
def test_no_trusted_proxies_ignores_header(self):
|
|
"""Пока прокси не настроен, заголовку верить нельзя вообще."""
|
|
assert client_address("127.0.0.1", "203.0.113.5", parse_allowlist("")) == "127.0.0.1"
|
|
|
|
def test_malformed_header_falls_back_to_peer(self):
|
|
trusted = parse_allowlist("127.0.0.1")
|
|
assert client_address("127.0.0.1", "не-адрес", trusted) == "127.0.0.1"
|
|
|
|
def test_ipv6_proxy_supported(self):
|
|
trusted = parse_allowlist("::1")
|
|
assert client_address("::1", "203.0.113.5", trusted) == "203.0.113.5"
|