Što REMOTE_ADDR u PHP-u doista govori iza VPN-a
To je vrijednost koju je isporučio vaš web poslužitelj, a ne uvid u tunel. Prođite put zahtjeva, provjerite tko ga smije prepisati i zadržite identitet u aplikaciji.
Netko pita zašto se korisnik VPN-a pojavljuje u zapisniku aplikacije s adresom koja pripada pristupniku, ili s adresom koja se promijenila nakon ručka. Odgovor počinje time što ta vrijednost jest: unos koji je web poslužitelj stavio u okruženje zahtjeva. To nije upit u tunel, nije identitet certifikata i nije obećanje da broj pripada jednoj osobi. Čitati je kao bilo što od toga troje daje samouvjerene odgovore koji su pogrešni na različite načine.
Vrijednost dolazi od poslužitelja, ne iz tunela
PHP prima okruženje zahtjeva od onoga što je izvršilo skriptu. PHP referenca poslužiteljskih varijabli opisuje te unose kao one koje stvara web poslužitelj, s dostupnošću koja ovisi o tome kako je zahtjev stigao.
Skripta pokrenuta kao hook naredbenog retka VPN-a posve je drugi kontekst izvršavanja. Nema web zahtjev, nema klijentski socket i nema REMOTE_ADDR, zato kopirani web kod u hooku daje prazne vrijednosti umjesto pogrešnih. Hook ima vlastito okruženje koje puni daemon i dokumentiran je zasebno. Posezati tamo za REMOTE_ADDR znači posezati za varijablom koja nikada nije postavljena.
Imajte tu razliku na umu prije nego usporedite dva zapisnika. Možda uspoređujete zahtjev za stranicu s hookom, a to uopće nije usporedba. Provjerite prvo kontekst izvršavanja, a zatim adresu.
Prođite put zahtjeva prije nego povjerujete broju
Prijavljena adresa je peer veze koju je web poslužitelj vidio. Stavite bilo što između klijenta i tog poslužitelja i peer se mijenja. Prijevod, terminacija i raspodjela opterećenja svaki pomiču opažanje jedan skok dalje od korisnika.
Četiri uobičajena puta daju četiri različita opažanja.
| Path to the listener | What can be reported |
|---|---|
| Client routed straight to the private listener, no translation | The client's tunnel address |
| Gateway translates the source before forwarding | The gateway's translated address |
| Reverse proxy terminates the client and opens its own backend connection | The proxy's backend address |
| Load balancer in front of two proxies | Whichever hop the server treats as its peer |
Zapišite put s imenom odredišta, obitelji adresa i svakom točkom prijevoda. Bez te karte ispravna i pogrešna vrijednost izgledaju jednako u retku zapisnika. Dva retka dijagrama štede poslijepodne rasprave.
Zamjena se događa samo tamo gdje je konfigurirana
Poslužitelj ili framework može namjerno zamijeniti adresu klijenta. Apacheov modul remote-IP i NGINXov modul real-IP rade upravo to, a vrijednost koju PHP primi ovisi o toj konfiguraciji i parametrima prenesenima rukovatelju skripte.
REMOTE_ADDR dakle nije univerzalno netaknuti TCP peer. To je peer onako kako ga je poslužitelj odlučio prijaviti nakon primjene vlastite politike. Ta razlika odlučuje je li vrijednost dokaz ili ukras.
Pitajte vlasnika poslužitelja koje je polje mjerodavno u ovom postavljanju i kako se čuva izvorni peer kada dođe do zamjene. Ako nitko ne može odgovoriti, zapisnik još ništa ne dokazuje.
Ne čitajte zaglavlja prosljeđivanja na povjerenje
Pozivatelj može sam poslati zaglavlja prosljeđivanja. Tretirati prvi zapis odvojen zarezom kao provjerenu korisničku adresu znači odlučiti vjerovati svakome tko se poveže, što je suprotno svrsi zaglavlja. Zaglavlje opisuje lanac i samo pouzdan sloj može jamčiti za taj lanac.
Upotrijebite podršku za pouzdane proxyje poslužitelja ili frameworka s konfiguriranim stvarnim lancem proxyja i dopustite joj da odbaci vrijednosti iz izvora izvan tog lanca. Ručno pisano parsiranje mjesto je gdje živi većina zanimljivih kvarova.
Adresa koju prijavi proxy također ne mijenja izvor paketa koji vidi vatrozid više uzvodno. Držite HTTP metapodatke i mrežno filtriranje kao odvojena opažanja jer odgovaraju na različita pitanja.
Za odluke rabite identitet aplikacije
Za pristup korisničkim zapisima oslonite se na autentificirani principal i pravila autorizacije aplikacije. Unutarnja adresa može se ponovno dodijeliti, a jedna prevedena adresa može predstavljati stotine istodobnih korisnika. Nijedno od tih svojstava ne može popraviti provjera adrese.
Ako operacije trebaju povezati zahtjev s VPN sesijom, spojite opaženu adresu i vremensku oznaku s mjerodavnim zapisima sesija prema dokumentiranom modelu prijevoda. To daje asocijaciju koju možete braniti; sama adresa ne.
Za dijagnostiku zabilježite ono nekoliko potrebnih polja umjesto cijelog polja poslužitelja koje može nositi zaglavlja i autentifikacijski materijal. Koristan zaključak kaže što ta vrijednost znači u ovom postavljanju, a ne koja vrijednost najviše nalikuje klijentu.