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

bash
# 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"
Note

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:

  1. Forwarded (RFC 7239) — ustandaryzowany nagłówek
  2. X-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:

text
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 IP

Zapobiega 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_PROXIES powodują 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ż