PHP cURL kakekrukker for atskilte brukersesjoner
Utforme PHP cURL-kakepersistens rundt den eksterne sesjonen: betrodde filnavn, eksplisitt lagring og samtidige forespørsler.
En PHP-applikasjon betjener Alice og Bob, og begge bruker dens serverside cURL-klient 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-konfigurasjonen 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 dens første overføring 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 besøkendes brukernavn eller sti 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 opprydding 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 kjenner nå 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å vellykket nedlasting fra vellykket persistens. 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 inn 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 deretter knyttes til hvilken som helst ny sesjon brukeren starter, uten at proxyadressen avgjør hvem sin innlogging som ligger i minnet.