PHP cURL-kakburkar för separata användarsessioner
Utforma PHP cURL-kakpersistens kring fjärrsessionen: betrodda filnamn, explicit sparning och samtidiga förfrågningar.
En PHP-applikation betjänar Alice och Bob, och båda använder dess cURL-klient på serversidan för att nå samma fjärrwebbplats via en proxy. Om varje förfrågan läser in cookies.txt kan de två användarna ärva samma fjärrinloggning. Att ändra deras proxyadresser skiljer inte den filen.
Välj kakans ägare innan du väljer filnamnet. Vanligtvis är det applikationens logiska fjärrsession: en lokal användare, ett visst fjärrkonto och, där det behövs, en separat arbetsyta. En proxy-slutpunkt är ett routingval, inte en tillförlitlig sessionsidentifierare. Flera användare kan dela en slutpunkt, och en slutpunkt kan rotera utgångar.
Läs in och spara samma sessions burk
Låt applikationen mappa sin autentiserade session till en servergenererad filnyckel. Med en privat kakmapp och en betrodd $sessionKey har cURL-konfigurationen denna form:
$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,
]);
För ett tillåtet sessionstest på en offentlig webbplats i ett nätverk som tillåter en offentlig mellanhand tillhandahåller HTTP-proxylistan kandidatslutpunkter. Använd ett handtag utan konfigurerad proxyautentisering eller sparade proxyuppgifter och håll kaktillståndet tilldelat den avsedda sessionen. Detta fragment konfigurerar ett handtag; applikationen utför överföringen och kontrollerar resultatet via sitt vanliga förfrågningsflöde. COOKIEFILE läser in tidigare kakor för sessionen. COOKIEJAR väljer var handtaget skriver sina sparade kakor. Att bara ange utdatafilen läser inte in den tidigare inloggningen.
En ny session kan börja utan fil. Ge dess första överföring den avsedda burkvägen, låt webbplatsen etablera kakorna och spara det resulterande tillståndet för nästa förfrågan. Kakmappen måste vara skrivbar för applikationens arbetare och hållas utanför det offentligt betjänade dokumentträdet. Gör inte ett användarnamn eller en sökväg från en besökare till ett filnamn; slå upp den betrodda nyckeln på servern.
Sparandet behöver en plats i förfrågans livscykel
libcurl skriver vanligtvis burken under handtagets städning. Om applikationen behöver en explicit sparpunkt efter fjärrutbytet kan den begära:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Detta skriver kakorna som handtaget för närvarande känner till till sin konfigurerade burk. Avsluta användningen av handtaget för den sessionen innan du tilldelar det orelaterat arbete. Att bara ändra burkvägen på ett handtag som redan håller Alices kakor är inte detsamma som att skapa Bobs rena session.
Skilj också en lyckad nedladdning från en lyckad persistens. Dokumentationen för kakburken noterar att ett skrivfel under städningen inte returneras som ett vanligt överföringsfel. Kontrollera mappägande, behörigheter och applikationens diagnostiska utdata när en inloggning fungerar för en förfrågan och försvinner vid nästa.
Samtidiga förfrågningar inför en annan gräns. Två arbetare kan läsa in samma gamla burk, oberoende ändra sitt tillstånd i minnet och sedan spara olika resultat. En låsning per session eller motsvarande serialisering måste täcka hela sekvensen av inläsning, utbyte och sparning om båda förfrågningarna delar en fjärrinloggning; att bara låsa den slutliga skrivningen förenar inte deras tidigare ögonblicksbilder. Olika sessioner bör ha olika filer och oberoende lås.
Vid utloggning avslutar du den avsedda fjärrsessionen och drar tillbaka dess lokala kaktillstånd enligt applikationens policy. En nyligen vald proxy kan sedan kopplas till vilken ny session som helst som användaren startar, utan att proxyadressen ansvarar för att avgöra vems inloggning som finns i minnet.