Kaj REMOTE_ADDR v PHP-ju v resnici pove za VPN-om
To je vrednost, ki jo je priskrbel vaš spletni strežnik, ne vpogled v tunel. Pojdite po poti zahteve, preverite, kdo jo sme prepisati, in identiteto obdržite v aplikaciji.
Nekdo vpraša, zakaj se uporabnik VPN-a pojavi v dnevniku aplikacije z naslovom, ki pripada prehodu, ali z naslovom, ki se je po kosilu spremenil. Odgovor se začne s tem, kaj ta vrednost je: vnos, ki ga je spletni strežnik vstavil v okolje zahteve. To ni poizvedba v tunel, ni identiteta potrdila in ni obljuba, da številka pripada eni osebi. Branje kot karkoli od tega trojega daje samozavestne odgovore, ki so napačni na različne načine.
Vrednost prihaja s strežnika, ne iz tunela
PHP prejme okolje zahteve od tistega, kar je izvedlo skript. PHP referenca strežniških spremenljivk te vnose opisuje kot tiste, ki jih ustvari spletni strežnik, z razpoložljivostjo, ki je odvisna od tega, kako je zahteva prispela.
Skript, zagnan kot hook ukazne vrstice VPN-a, je povsem drugo izvajalno okolje. Nima spletne zahteve, nima odjemalskega socketa in nima REMOTE_ADDR, zato kopirana spletna koda v hooku vrne prazne vrednosti namesto napačnih. Hook ima svoje okolje, ki ga napolni daemon, in je dokumentiran ločeno. Seganje po REMOTE_ADDR tam pomeni seganje po spremenljivki, ki ni bila nikoli nastavljena.
Imejte to razliko v mislih, preden primerjate dva dnevnika. Morda primerjate zahtevo za stran s hookom, in to sploh ni primerjava. Najprej preverite izvajalno okolje, nato naslov.
Pojdite po poti zahteve, preden zaupate številki
Prijavljeni naslov je peer povezave, ki jo je videl spletni strežnik. Vstavite karkoli med odjemalca in ta strežnik, in peer se spremeni. Prevod, zaključevanje in razporejanje obremenitve vsak premaknejo opažanje en skok dlje od uporabnika.
Štiri običajne poti dajejo štiri različna 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 pot z imenom cilja, družino naslovov in vsako točko prevoda. Brez tega zemljevida sta pravilna in napačna vrednost v vrstici dnevnika videti enaki. Dve vrstici diagrama prihranita popoldne razprave.
Zamenjava se zgodi le tam, kjer je nastavljena
Strežnik ali ogrodje lahko namerno zamenja odjemalčev naslov. Apacheov modul remote-IP in NGINXov modul real-IP delata prav to, vrednost, ki jo prejme PHP, pa je odvisna od te nastavitve in parametrov, predanih upravljalniku skripta.
REMOTE_ADDR torej ni univerzalno nedotaknjeni TCP peer. To je peer, kakršnega se je strežnik odločil prijaviti po uporabi lastne politike. Ta razlika odloči, ali je vrednost dokaz ali okrasek.
Vprašajte lastnika strežnika, katero polje je v tej namestitvi verodostojno in kako se ohrani izvirni peer, ko do zamenjave pride. Če nihče ne zna odgovoriti, dnevnik še ni dokaz za nič.
Glav za posredovanje ne berite na zaupanje
Klicatelj lahko glave za posredovanje pošlje sam. Če prvi z vejico ločeni vnos obravnavate kot preverjen uporabniški naslov, se odločite verjeti vsakomur, ki se poveže, kar je nasprotno namenu glave. Glava opisuje verigo in le zaupanja vreden sklad lahko jamči za to verigo.
Uporabite podporo za zaupanja vredne proxyje strežnika ali ogrodja z nastavljeno dejansko verigo proxyjev in pustite, da zavrže vrednosti iz virov zunaj te verige. Ročno napisano razčlenjevanje je kraj, kjer živi večina zanimivih okvar.
Naslov, ki ga prijavi proxy, tudi ne spremeni izvora paketov, ki ga vidi požarni zid višje gorvodno. Imejte metapodatke HTTP in omrežno filtriranje kot ločena opažanja, ker odgovarjata na različni vprašanji.
Za odločitve uporabite identiteto aplikacije
Za dostop do uporabnikovih zapisov se zanesite na preverjeni principal in pravila avtorizacije aplikacije. Notranji naslov je mogoče znova dodeliti in en prevedeni naslov lahko predstavlja stotine hkratnih uporabnikov. Nobene od teh lastnosti preverjanje naslova ne more popraviti.
Če mora obratovanje povezati zahtevo s sejo VPN, povežite opaženi naslov in časovni žig z verodostojnimi zapisi sej po dokumentiranem modelu prevoda. To daje povezavo, ki jo lahko branite; sam naslov ne.
Za diagnostiko zabeležite tistih nekaj potrebnih polj namesto celotnega polja strežnika, ki lahko nosi glave in gradivo za preverjanje pristnosti. Koristen sklep pove, kaj ta vrednost pomeni v tej namestitvi, ne katera vrednost je najbolj podobna odjemalcu.