PHP-cURL-Cookie-Jars für getrennte Benutzersitzungen
PHP-cURL-Cookie-Persistenz rund um die entfernte Sitzung gestalten: vertrauenswürdige Dateinamen, explizites Speichern und parallele Anfragen.
Eine PHP-Anwendung bedient Alice und Bob, und beide nutzen ihren serverseitigen cURL-Client, um über einen Proxy dieselbe entfernte Website zu erreichen. Wenn jede Anfrage cookies.txt lädt, können beide Benutzer dasselbe entfernte Login erben. Das Ändern ihrer Proxy-Adressen trennt diese Datei nicht.
Wählen Sie den Cookie-Eigentümer, bevor Sie den Dateinamen wählen. Meist ist es die logische entfernte Sitzung der Anwendung: ein lokaler Benutzer, ein bestimmtes entferntes Konto und, wo nötig, ein separater Arbeitsbereich. Ein Proxy-Endpunkt ist eine Routing-Entscheidung, keine verlässliche Sitzungskennung. Mehrere Benutzer können einen Endpunkt teilen, und ein Endpunkt kann Ausgänge rotieren.
Das Glas derselben Sitzung laden und speichern
Lassen Sie die Anwendung ihre authentifizierte Sitzung auf einen vom Server erzeugten Dateischlüssel abbilden. Mit einem privaten Cookie-Verzeichnis und einem vertrauenswürdigen $sessionKey hat die cURL-Konfiguration diese 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 einen erlaubten Sitzungstest auf einer öffentlichen Website in einem Netz, das einen öffentlichen Vermittler zulässt, liefert die HTTP-Proxy-Liste Kandidaten-Endpunkte. Verwenden Sie ein Handle ohne konfigurierte Proxy-Authentifizierung oder gespeicherte Proxy-Anmeldedaten und halten Sie den Cookie-Zustand der vorgesehenen Sitzung zugeordnet. Dieses Fragment konfiguriert ein Handle; die Anwendung führt die Übertragung aus und prüft das Ergebnis über ihren normalen Anfrageablauf. COOKIEFILE lädt vorherige Cookies der Sitzung. COOKIEJAR legt fest, wohin das Handle seine gespeicherten Cookies schreibt. Nur die Ausgabedatei zu setzen lädt das frühere Login nicht.
Eine neue Sitzung kann ohne Datei beginnen. Geben Sie ihrer ersten Übertragung den vorgesehenen Glas-Pfad, lassen Sie die Website die Cookies etablieren und speichern Sie den resultierenden Zustand für die nächste Anfrage. Das Cookie-Verzeichnis muss für den Worker der Anwendung beschreibbar sein und außerhalb des öffentlich ausgelieferten Dokumentbaums bleiben. Machen Sie keinen vom Besucher gelieferten Benutzernamen und keinen Pfad zu einem Dateinamen; schlagen Sie den vertrauenswürdigen Schlüssel auf dem Server nach.
Speichern braucht einen Platz im Anfrage-Lebenszyklus
libcurl schreibt das Glas normalerweise beim Aufräumen des Handles. Braucht die Anwendung nach dem entfernten Austausch einen expliziten Speicherpunkt, kann sie anfordern:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Dies schreibt die dem Handle derzeit bekannten Cookies in sein konfiguriertes Glas. Beenden Sie die Nutzung des Handles für diese Sitzung, bevor Sie es unrelated Arbeit zuweisen. Nur den Glas-Pfad auf einem Handle zu ändern, das bereits Alices Cookies hält, ist nicht gleichbedeutend mit dem Erzeugen von Bobs sauberer Sitzung.
Unterscheiden Sie außerdem einen erfolgreichen Download von einer erfolgreichen Persistenz. Die Cookie-Jar-Dokumentation merkt an, dass ein Schreibfehler beim Aufräumen nicht als gewöhnlicher Übertragungsfehler zurückgegeben wird. Prüfen Sie Verzeichnis-Eigentümerschaft, Berechtigungen und die Diagnoseausgabe der Anwendung, wenn ein Login für eine Anfrage funktioniert und bei der nächsten verschwindet.
Parallele Anfragen führen eine weitere Grenze ein. Zwei Worker können dasselbe alte Glas laden, unabhängig ihren In-Memory-Zustand ändern und dann unterschiedliche Ergebnisse speichern. Ein Lock pro Sitzung oder eine äquivalente Serialisierung muss die gesamte Folge aus Laden, Austausch und Speichern abdecken, wenn beide Anfragen ein entferntes Login teilen; nur das abschließende Schreiben zu sperren, gleicht ihre früheren Momentaufnahmen nicht ab. Verschiedene Sitzungen sollten verschiedene Dateien und unabhängige Locks haben.
Beim Logout beenden Sie die vorgesehene entfernte Sitzung und ziehen ihren lokalen Cookie-Zustand gemäß der Richtlinie der Anwendung zurück. Ein neu gewählter Proxy kann dann an jede neue Sitzung angehängt werden, die der Benutzer beginnt, ohne dass die Proxy-Adresse entscheidet, wessen Login im Speicher liegt.