Zaufane proxy
Gdy OxPHP działa za reverse proxy (Kubernetes Ingress, Cloudflare, AWS ALB, nginx), każde żądanie przychodzi z adresu IP proxy. Bez konfiguracji zaufanych proxy ograniczanie liczby żądań, rejestrowanie dostępu oraz $_SERVER['REMOTE_ADDR'] widzą adres IP proxy zamiast rzeczywistego klienta.
Konfiguracja
# Comma-separated CIDR list
TRUSTED_PROXIES="10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
# Shorthand: all RFC-1918 + loopback + link-local (IPv4 and IPv6)
TRUSTED_PROXIES="private"Gdy zmienna nie jest ustawiona, OxPHP ignoruje wszystkie nagłówki przekierowania. To bezpieczne ustawienie domyślne.
Jak to działa
Gdy żądanie przychodzi z zaufanego adresu IP, OxPHP analizuje nagłówki przekierowania w kolejności priorytetów:
Forwarded(RFC 7239) — ustandaryzowany nagłówekX-Forwarded-For/X-Forwarded-Proto/X-Forwarded-Host/X-Forwarded-Port— faktyczny fallback
Jeśli obecny jest nagłówek Forwarded, nagłówki X-Forwarded-* są ignorowane.
Wydobywanie adresu IP klienta
OxPHP stosuje algorytm rightmost-non-trusted (skrajnie prawy niezaufany) — to samo podejście, którego używają nginx (real_ip_recursive on), Caddy, Traefik i Apache:
X-Forwarded-For: 203.0.113.50, 172.16.1.1, 10.0.0.5
TCP peer: 10.0.0.1 (trusted)
Walk right-to-left:
10.0.0.5 → trusted → skip
172.16.1.1 → trusted → skip
203.0.113.50 → NOT trusted → client IPZapobiega to podszywaniu się przez doklejanie wartości z lewej strony. Atakujący może dodać fałszywe adresy IP po lewej stronie, ale skrajnie prawy niezaufany adres IP został ustawiony przez ostatnie zaufane proxy w łańcuchu.
Co się zmienia
Gdy TRUSTED_PROXIES jest skonfigurowane, a łączący się adres IP jest zaufany:
| Komponent | Bez zaufanych proxy | Z zaufanymi proxy |
|---|---|---|
$_SERVER['REMOTE_ADDR'] |
IP proxy | Rzeczywisty IP klienta |
$_SERVER['REMOTE_PORT'] |
Port źródłowy proxy | Port klienta z Forwarded: for=ip:port, w przeciwnym razie 0 |
$_SERVER['HTTPS'] |
Na podstawie konfiguracji TLS OxPHP | Z Forwarded: proto= lub X-Forwarded-Proto |
$_SERVER['REQUEST_SCHEME'] |
http lub https z TLS |
Z przekazanego protokołu |
$_SERVER['SERVER_NAME'] |
Z nagłówka Host |
Z Forwarded: host= lub X-Forwarded-Host |
$_SERVER['SERVER_PORT'] |
Z nagłówka Host |
Z X-Forwarded-Port, w przeciwnym razie port z X-Forwarded-Host / Forwarded: host=, w przeciwnym razie 443/80 |
| Ograniczanie liczby żądań | Na IP proxy | Na IP klienta |
| Dziennik dostępu | IP proxy | Rzeczywisty IP klienta |
REMOTE_PORT wynosi 0 za proxy, chyba że węzeł Forwarded: for=ip:port zgodny z RFC 7239 przenosi port źródłowy klienta. X-Forwarded-For nie ma pola portu, więc przepisanej wartości nie da się zrekonstruować i jest ona zerowana zamiast zgadywana.
Sieci private
Skrót private obejmuje:
| Sieć | Opis |
|---|---|
10.0.0.0/8 |
Prywatna klasy A |
172.16.0.0/12 |
Prywatna klasy B |
192.168.0.0/16 |
Prywatna klasy C |
127.0.0.0/8 |
Loopback |
169.254.0.0/16 |
Link-local |
::1/128 |
IPv6 loopback |
fc00::/7 |
IPv6 unique local |
fe80::/10 |
IPv6 link-local |
Bezpieczeństwo
- Bezpieczne ustawienie domyślne — bez
TRUSTED_PROXIESżadne nagłówki przekierowania nie są przetwarzane - Walidacja CIDR — nieprawidłowe wartości w
TRUSTED_PROXIESpowodują błąd przy starcie - Odporność na podszywanie — algorytm rightmost-non-trusted ignoruje wartości doklejone przez atakującego
- Żądania z niezaufanych adresów IP mają swoje nagłówki przekierowania całkowicie ignorowane
Zobacz też
- Ograniczanie liczby żądań — ograniczanie liczby żądań per IP używa rozwiązanego adresu IP klienta
- Rejestrowanie dostępu — pole
remote_ippokazuje rozwiązany adres IP klienta - Dokumentacja konfiguracji — wszystkie zmienne środowiskowe