Што всушност кажува REMOTE_ADDR во PHP зад VPN
Тоа е вредност што ја доставил вашиот веб сервер, а не увид во тунелот. Проследете ја патеката на барањето, проверете кој смее да го препише и задржете го идентитетот во апликацијата.
Некој прашува зошто корисник на VPN се појавува во дневникот на апликацијата со адреса што му припаѓа на портата, или со адреса што се променила по ручекот. Одговорот почнува со тоа што е таа вредност: запис што веб серверот го ставил во околината на барањето. Тоа не е барање до тунелот, не е идентитет на сертификат и не е ветување дека бројот припаѓа на една личност. Читањето како било што од тие три дава самоуверени одговори што се погрешни на различни начини.
Вредноста доаѓа од серверот, не од тунелот
PHP ја добива околината на барањето од она што ја извршило скриптата. PHP референцата за серверски променливи ги опишува овие записи како создадени од веб серверот, со достапност што зависи од тоа како пристигнало барањето.
Скрипта извршена како hook од командната линија на VPN е сосема друг контекст на извршување. Нема веб барање, нема клиентски сокет и нема REMOTE_ADDR, затоа копиран веб код во hook дава празни вредности наместо погрешни. Hook има своја околина, која ја полни демонот, и е документиран одделно. Посегнувањето таму по REMOTE_ADDR е посегнување по променлива што никогаш не била поставена.
Имајте ја таа разлика на ум пред да споредите два дневника. Можеби споредувате барање за страница со hook, а тоа воопшто не е споредба. Проверете го прво контекстот на извршување, а потоа адресата.
Проследете ја патеката на барањето пред да му верувате на бројот
Пријавената адреса е peer на врската што ја видел веб серверот. Ставете било што меѓу клиентот и тој сервер и peer-от се менува. Преводот, терминацијата и распределбата на оптоварувањето секој го поместува набљудувањето еден чекор подалеку од корисникот.
Четири вообичаени патеки даваат четири различни набљудувања.
| 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 |
Запишете ја патеката со името на одредиштето, фамилијата адреси и секоја точка на превод. Без таа карта исправна и погрешна вредност изгледаат исто во ред од дневникот. Два реда дијаграм штедат попладне расправа.
Замената се случува само таму каде што е конфигурирана
Сервер или framework може намерно да ја замени адресата на клиентот. Модулот remote-IP на Apache и модулот real-IP на NGINX го прават токму тоа, а вредноста што ја прима PHP зависи од таа конфигурација и параметрите предадени на ракувачот на скриптата.
Значи, REMOTE_ADDR не е универзално недопрениот TCP peer. Тоа е peer-от како што серверот одлучил да го пријави откако ја применил сопствената политика. Таа разлика одлучува дали вредноста е доказ или украс.
Прашајте го сопственикот на серверот кое поле е меродавно во оваа инсталација и како се чува оригиналниот peer кога доаѓа до замена. Ако никој не може да одговори, дневникот сѐ уште не докажува ништо.
Не читајте ги заглавјата за проследување на доверба
Повикувачот може сам да испрати заглавја за проследување. Третирањето на првиот запис одделен со запирка како проверена корисничка адреса значи одлука да се верува на секој што ќе се поврзе, што е спротивно на целта на заглавјето. Заглавјето опишува ланец и само доверлив слој може да гарантира за тој ланец.
Користете ја поддршката за доверливи proxy сервери на серверот или framework-от со конфигуриран вистински ланец на proxy и дозволете да ги отфрли вредностите од извори надвор од тој ланец. Рачно напишаното парсирање е местото каде живеат повеќето интересни дефекти.
Адреса пријавена од proxy исто така не го менува изворот на пакетите што го гледа заштитниот ѕид повисоко. Држете ги HTTP метаподатоците и мрежното филтрирање како одделни набљудувања, зашто одговараат на различни прашања.
За одлуки користете го идентитетот на апликацијата
За пристап до записите на корисникот потпрете се на автентицираниот principal и правилата за авторизација на апликацијата. Внатрешна адреса може повторно да се додели, а една преведена адреса може да претставува стотици истовремени корисници. Ниту едно од тие својства не може да го поправи проверка на адреса.
Ако операциите треба да го поврзат барањето со VPN сесија, поврзете ја набљудуваната адреса и временската ознака со меродавните записи за сесии според документираниот модел на превод. Тоа дава асоцијација што можете да ја браните; самата адреса не.
За дијагностика запишете ги тие неколку потребни полиња наместо целиот масив на серверот што може да носи заглавја и материјал за автентикација. Корисниот заклучок кажува што значи оваа вредност во оваа инсталација, а не која вредност најмногу личи на клиент.