Aplikace v PHP obsluhuje Alici a Boba a oba používají její serverový cURL klient k přístupu na stejný vzdálený web přes proxy. Pokud každý požadavek načítá cookies.txt, mohou oba uživatelé zdědit stejné vzdálené přihlášení. Změna jejich proxy adres tento soubor neoddělí.

Vlastníka cookies vyberte dříve než název souboru. Obvykle jím je logická vzdálená relace aplikace: místní uživatel, konkrétní vzdálený účet a v případě potřeby samostatný pracovní prostor. Koncový bod proxy je volba směrování, nikoli spolehlivý identifikátor relace. Několik uživatelů může sdílet jeden koncový bod a koncový bod může střídat výstupy.

Načítejte a ukládejte sklenici stejné relace

Nechte aplikaci mapovat ověřenou relaci na serverem generovaný klíč souboru. Se soukromým adresářem cookies a důvěryhodným $sessionKey má konfigurace 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,
]);

Pro povolený test relace veřejného webu v síti, která umožňuje veřejného prostředníka, dodává seznam HTTP proxy kandidátské koncové body. Použijte handle bez nakonfigurovaného ověřování proxy nebo uchovaných přihlašovacích údajů proxy a stav cookies ponechte přiřazený zamýšlené relaci. Tento fragment konfiguruje handle; aplikace provádí přenos a kontroluje výsledek běžným tokem požadavků. COOKIEFILE načítá předchozí cookies relace. COOKIEJAR určuje, kam handle zapisuje uchované cookies. Nastavení pouze výstupního souboru předchozí přihlášení nenačte.

Nová relace může začít bez souboru. Dejte jejímu prvnímu přenosu zamýšlenou cestu sklenice, nechte web nastavit cookies a výsledný stav uložte pro další požadavek. Adresář cookies musí být zapisovatelný pracovníkem aplikace a musí zůstat mimo veřejně obsluhovaný strom dokumentů. Nepřevádějte návštěvníkem dodané uživatelské jméno ani cestu na název souboru; důvěryhodný klíč vyhledejte na serveru.

Ukládání potřebuje místo v životním cyklu požadavku

libcurl obvykle zapisuje sklenici při čištění handle. Pokud aplikace potřebuje explicitní bod uložení po vzdálené výměně, může požádat:

curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');

Tím zapíše cookies, které handle aktuálně zná, do své nakonfigurované sklenice. Používání handle pro tuto relaci dokončete, než jej přiřadíte nesouvisející práci. Změna pouze cesty sklenice na handle, který již drží Aliciiny cookies, není totéž jako vytvoření čisté Bobovy relace.

Rozlišujte také úspěšné stažení od úspěšného uchování. Dokumentace sklenice na cookies uvádí, že selhání zápisu při čištění se nevrací jako běžná chyba přenosu. Zkontrolujte vlastnictví adresáře, oprávnění a diagnostický výstup aplikace, když přihlášení funguje pro jeden požadavek a u dalšího zmizí.

Souběžné požadavky zavádějí další hranici. Dva pracovníci mohou načíst stejnou starou sklenici, nezávisle změnit svůj stav v paměti a poté uložit různé výsledky. Zámek na relaci nebo ekvivalentní serializace musí pokrýt celou sekvenci načtení, výměny a uložení, pokud oba požadavky sdílejí jedno vzdálené přihlášení; zamčení pouze závěrečného zápisu jejich dřívější snímky nesladí. Různé relace by měly mít různé soubory a nezávislé zámky.

Při odhlášení ukončete zamýšlenou vzdálenou relaci a vyřaďte její místní stav cookies podle zásad aplikace. Nově zvolená proxy se pak může připojit k jakékoli nové relaci, kterou uživatel zahájí, aniž by adresa proxy rozhodovala o tom, čí přihlášení je v paměti.

Související články