PHP cURL poháre na cookies pre oddelené používateľské relácie
Návrh uchovávania cookies v PHP cURL okolo vzdialenej relácie: dôveryhodné názvy súborov, explicitné ukladanie a paralelné požiadavky.
Aplikácia v PHP obsluhuje Alicu a Boba a obaja používajú jej serverový cURL klient na prístup k tej istej vzdialenej stránke cez proxy. Ak každá požiadavka načítava cookies.txt, obaja používatelia môžu zdediť rovnaké vzdialené prihlásenie. Zmena ich proxy adries tento súbor neoddelí.
Vlastníka cookie vyberte skôr než názov súboru. Zvyčajne ním je logická vzdialená relácia aplikácie: miestny používateľ, konkrétny vzdialený účet a v prípade potreby samostatný pracovný priestor. Koncový bod proxy je voľba smerovania, nie spoľahlivý identifikátor relácie. Viacerí používatelia môžu zdieľať jeden koncový bod a koncový bod môže striedať výstupy.
Načítajte a ukladajte pohár tej istej relácie
Nechajte aplikáciu namapovať overenú reláciu na kľúč súboru generovaný serverom. So súkromným adresárom cookies a dôveryhodným $sessionKey má konfigurácia cURL tento tvar:
$jar = $cookieDirectory . '/' . $sessionKey . '.cookies';
$ch = curl_init('https://service.example.net/account');
curl_setopt_array($ch, [
CURLOPT_PROXY => 'http://proxy.example.net:8080',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEFILE => $jar,
CURLOPT_COOKIEJAR => $jar,
]);
Pre povolený test relácie verejnej stránky v sieti, ktorá umožňuje verejného sprostredkovateľa, zoznam HTTP proxy poskytuje kandidátske koncové body. Použite handle bez nakonfigurovanej autentifikácie proxy alebo uchovaných prihlasovacích údajov proxy a stav cookies držte priradený zamýšľanej relácii. Tento fragment konfiguruje handle; aplikácia vykoná prenos a overí výsledok svojím bežným tokom požiadaviek. COOKIEFILE načíta predchádzajúce cookies relácie. COOKIEJAR určuje, kam handle zapisuje uchované cookies. Nastavenie iba výstupného súboru predchádzajúce prihlásenie nenačíta.
Nová relácia môže začať bez súboru. Dajte jej prvému prenosu zamýšľanú cestu pohára, nechajte stránku zaviesť cookies a výsledný stav uložte pre ďalšiu požiadavku. Adresár cookies musí byť zapisovateľný pracovníkom aplikácie a musí zostať mimo verejne obsluhovaného stromu dokumentov. Nepremieňajte používateľské meno ani cestu poskytnutú návštevníkom na názov súboru; dôveryhodný kľúč vyhľadajte na serveri.
Ukladanie potrebuje miesto v životnom cykle požiadavky
libcurl zvyčajne zapisuje pohár počas čistenia handle. Ak aplikácia potrebuje explicitný bod uloženia po vzdialenej výmene, môže požiadať:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Toto zapíše cookies, ktoré handle aktuálne pozná, do jeho nakonfigurovaného pohára. Dokončite používanie handle pre túto reláciu, než ho priradíte nesúvisiacej práci. Zmena iba cesty pohára na handle, ktorý už drží Alicine cookies, nie je to isté ako vytvorenie čistej Bobovej relácie.
Rozlišujte aj úspešné stiahnutie od úspešného uchovania. Dokumentácia pohára na cookies uvádza, že zlyhanie zápisu počas čistenia sa nevracia ako bežná chyba prenosu. Skontrolujte vlastníctvo adresára, oprávnenia a diagnostický výstup aplikácie, keď prihlásenie funguje pre jednu požiadavku a pri ďalšej zmizne.
Paralelné požiadavky zavádzajú ďalšiu hranicu. Dvaja pracovníci môžu načítať ten istý starý pohár, nezávisle zmeniť svoj stav v pamäti a potom uložiť rôzne výsledky. Zámok na reláciu alebo ekvivalentná serializácia musí pokryť celú sekvenciu načítania, výmeny a uloženia, ak obe požiadavky zdieľajú jedno vzdialené prihlásenie; zamknutie iba záverečného zápisu nezosúladí ich skoršie snímky. Rôzne relácie by mali mať rôzne súbory a nezávislé zámky.
Pri odhlásení ukončite zamýšľanú vzdialenú reláciu a vyraďte jej miestny stav cookies podľa zásad aplikácie. Novo zvolenú proxy potom možno pripojiť k akejkoľvek novej relácii, ktorú používateľ začne, bez toho, aby adresa proxy rozhodovala, čie prihlásenie je v pamäti.