Safu ya $_ENV tupu katika script ya hook inaonekana kama uthibitisho kwamba OpenVPN haikupitisha chochote. Kwa kawaida inathibitisha kitu kingine kabisa: PHP ilisanidiwa kutojaza superglobal hiyo, na thamani zilikuwa katika mazingira ya mchakato muda wote. Hitimisho la pili la uongo ni dogo zaidi, kwa sababu vigezo viwili vya anwani katika hook ya muunganisho vinamaanisha mambo tofauti na hutumika kwa kubadilishana. Makosa yote mawili yanagharimu mchana mmoja ukianza na lile baya.

Anwani mbili, madai mawili tofauti

Ncha ya nje ni kile seva ilichoona wakati mteja alipounganishwa, inapatikana kama trusted_ip kwa IPv4 na trusted_ip6 kwa IPv6. Anwani pepe ni kile bwawa lilitoa kwa kipindi hiki, inapatikana kama ifconfig_pool_remote_ip.

Zinajibu maswali tofauti, na rekodi kwa kawaida inahitaji moja yao, si zote mbili. Ya kwanza ni mahali muunganisho ulipotoka, ambayo inaweza kuwa anwani ya NAT inayoshirikiwa na mamia ya watu. Ya pili ni mahali kipindi hiki kinapoishi ndani ya handaki, na inaweza kupewa kipindi kingine baadaye. Kuchanganya hizo mbili hutoa rekodi zinazoonekana kuaminika na ni mbaya.

Usomaji mdogo unaonekana hivi.

$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner  = getenv('ifconfig_pool_remote_ip');
$outer  = $outer4 !== false ? $outer4 : $outer6;

Hakuna thamani inayomtambua mtu. Moja ni uchunguzi wa mtandao, nyingine ni ukodishaji, na rekodi inayochukua yoyote kati yao kama kitambulisho thabiti cha kifaa itakuwa mbaya mara ya kwanza mteja anapounganishwa tena kutoka mtandao mwingine au kupata anwani nyingine ya bwawa. Chagua sehemu kulingana na swali ambalo rekodi inapaswa kujibu, kisha uandike swali hilo kando ya safu.

Angalia jinsi PHP ilivyozinduliwa, si shell yako

Hook inaendesha kama mtoto wa daemon ya VPN na mazingira ambayo daemon huunda. Shell yako ya mwingiliano ina mengine, na kuendesha script kwa mkono hujaribu mazingira ya shell, si ya hook.

Anza kwa kuthibitisha kwamba hook ilifanya kazi kweli katika hatua uliyotarajia. Script iliyoambatanishwa na hatua isiyo sahihi, au ambayo haikuwahi kuendesha kwa sababu agizo linaelekeza kwenye njia nyingine, hutoa dalili sawa kabisa na kigezo kinachokosekana. Ongeza mstari wa alama kwa makusudi juu ya script na uthibitisha kwamba unaonekana kabla ya kuchunguza kitu kingine chochote. Mstari mmoja wenye muhuri wa muda katika kumbukumbu hutenganisha «haikuwahi kuendesha» na «iliendesha bila thamani».

Kisha thibitisha ni mkalimani gani na faili gani ya usanidi ambao wito huo unatumia. Kuhariri usanidi wa PHP kwa seva ya wavuti hakubadilishi chochote kwa mchakato wa CLI uliozinduliwa na OpenVPN, na zote mbili zinaweza kupakia faili php.ini tofauti kabisa.

Kwa nini $_ENV tupu haithibitishi chochote

PHP marejeo ya getenv yanaeleza usomaji wa moja kwa moja wa mazingira ya mchakato, ambao hurudisha false wakati jina halipo. Superglobal $_ENV hujazwa kwa tofauti, na agizo variables_order huamua ni superglobal zipi zitajazwa.

Ikiwa agizo hilo linaacha E, $_ENV hubaki tupu bila kujali mazingira yana nini. Msimbo unaoiorodhesha kisha huripoti kigezo kinachokosekana ambacho kwa kweli kipo, na uchunguzi unaelekea OpenVPN wakati jibu liko katika php.ini. Angalia agizo mahsusi kwa usanidi wa CLI, si kwa seva ya wavuti.

Kusoma kwa getenv kunaepuka mkanganyiko huu wote, na script ya kufunika inayosafisha mazingira kabla ya kuita mkalimani huirudisha kwa namna nyingine.

Hifadhi uhusiano, si sasisho la safu

Amua ni thamani gani rekodi inahitaji kabla ya kuandika. Ikiwa lengo ni kubainisha kipindi kilitoka wapi, hifadhi ncha ya nje na uilete kama uchunguzi. Ikiwa lengo ni kuhusisha kipindi na anwani ya handaki kwa muda wa muunganisho, hifadhi anwani ya bwawa na uihusishe na kipindi.

Sasisha kwa kitambulisho kilichothibitishwa na kipindi cha sasa, si kwa kila safu inayoshiriki anwani ya handaki, kwa sababu anwani za bwawa hutumika tena na tukio la kuachana lililochelewa linaweza kufuta data ya muunganisho mpya. Shughulikia IPv6 kwa uwazi badala ya kuandika kwa utulivu thamani ya IPv4 tu. Safu yenye anwani ya nje NULL ni bora kuliko safu yenye ile mbaya, kwa sababu ya kwanza inaonekana haijakamilika.

Husisha uandishi na kitambulisho cha kipindi ambacho OpenVPN hutoa ili kuunganisha tena kuunda rekodi mpya badala ya kuhariri ile ya zamani. Tumia taarifa zenye vigezo na akaunti yenye ruhusa zinazohitajika na operesheni pekee. Hook inaendesha kwa mamlaka ya daemon, kwa hiyo swali la kutojali ni tatizo pana kuliko mstari mbaya wa kumbukumbu.

Gundua bila kumwaga mazingira

Andika kumbukumbu ni majina gani yalikuwepo, hatua ipi iliendesha na mkalimani gani ulitumika. Usichapishe mazingira yote, kwa sababu mchakato wa hook unaweza kurithi thamani zisizohusiana ambazo hazipaswi kuishia katika faili ya kumbukumbu.

Thibitisha muunganisho mmoja kutoka mwanzo hadi mwisho: soma ncha ya nje, soma anwani iliyotolewa, na uthibitishe zote mbili dhidi ya mtazamo wa seva wenyewe kuhusu kipindi hicho. Mara jozi inapothibitishwa kwa mteja mmoja, uhusiano unaweza kuaminiwa mahali pengine.

Makala zinazohusiana