PHP cURL-kakekrukker for atskilte brukersesjoner
Utforme PHP cURL-kakelagring rundt den eksterne sesjonen: betrodde filnavn, eksplisitt lagring og samtidige forespørsler.
En PHP-applikasjon betjener Alice og Bob, og begge bruker cURL-klienten på serversiden for å nå det samme eksterne nettstedet gjennom en proxy. Hvis hver forespørsel laster cookies.txt, kan de to brukerne arve samme eksterne innlogging. Å endre proxyadressene deres skiller ikke den filen.
Velg kakens eier før du velger filnavnet. Vanligvis er det applikasjonens logiske eksterne sesjon: en lokal bruker, en bestemt ekstern konto og, der det trengs, et eget arbeidsområde. Et proxy-endepunkt er et rutingvalg, ikke en pålitelig sesjonsidentifikator. Flere brukere kan dele ett endepunkt, og et endepunkt kan rotere utganger.
Last og lagre krukken til samme sesjon
La applikasjonen koble sin autentiserte sesjon til en servergenerert filnøkkel. Med en privat kakemappe og en betrodd $sessionKey har cURL-oppsettet denne formen:
$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,
]);
For en tillatt sesjonstest på et offentlig nettsted i et nettverk som tillater en offentlig mellommann, leverer HTTP-proxylisten kandidatendepunkter. Bruk et håndtak uten konfigurert proxyautentisering eller lagrede proxy-legitimasjoner, og hold kaketilstanden tildelt den tiltenkte sesjonen. Dette utdraget konfigurerer et håndtak; applikasjonen utfører overføringen og kontrollerer resultatet gjennom sin vanlige forespørselsflyt. COOKIEFILE laster inn tidligere kaker for sesjonen. COOKIEJAR velger hvor håndtaket skriver sine lagrede kaker. Å bare sette utdatafilen laster ikke inn den tidligere innloggingen.
En ny sesjon kan starte uten fil. Gi den første overføringen den tiltenkte krukkeveien, la nettstedet etablere kakene, og lagre den resulterende tilstanden for neste forespørsel. Kakemappen må være skrivbar for applikasjonens arbeider og holdes utenfor det offentlig betjente dokumenttreet. Ikke gjør et brukernavn eller en sti fra en besøkende om til et filnavn; slå opp den betrodde nøkkelen på serveren.
Lagring trenger en plass i forespørselens livssyklus
libcurl skriver vanligvis krukken under oppryddingen av håndtaket. Hvis applikasjonen trenger et eksplisitt lagringspunkt etter den eksterne utvekslingen, kan den be om:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Dette skriver kakene håndtaket nå kjenner til den konfigurerte krukken. Avslutt bruken av håndtaket for den sesjonen før du tildeler det urelatert arbeid. Å endre bare krukkeveien på et håndtak som allerede holder Alices kaker, er ikke det samme som å lage Bobs rene sesjon.
Skill også en vellykket nedlasting fra vellykket lagring. Dokumentasjonen for kakekrukken bemerker at en skrivefeil under opprydding ikke returneres som en vanlig overføringsfeil. Kontroller mappeeierskap, tillatelser og applikasjonens diagnostiske utdata når en innlogging fungerer for én forespørsel og forsvinner ved den neste.
Samtidige forespørsler innfører en annen grense. To arbeidere kan laste den samme gamle krukken, uavhengig endre tilstanden i minnet og deretter lagre ulike resultater. En lås per sesjon eller tilsvarende serialisering må dekke hele sekvensen med lasting, utveksling og lagring hvis begge forespørslene deler én ekstern innlogging; å låse bare den siste skrivingen forener ikke deres tidligere øyeblikksbilder. Ulike sesjoner bør ha ulike filer og uavhengige låser.
Ved utlogging avsluttes den tiltenkte eksterne sesjonen, og dens lokale kaketilstand trekkes tilbake etter applikasjonens policy. En nylig valgt proxy kan da knyttes til enhver ny sesjon brukeren starter, uten at proxyadressen avgjør hvem sin innlogging som ligger i minnet.