Aplikacja PHP obsługuje Alice i Boba, a oboje używają jej serwerowego klienta cURL, aby przez proxy dotrzeć do tej samej zdalnej witryny. Jeśli każde żądanie wczytuje cookies.txt, obaj użytkownicy mogą odziedziczyć to samo zdalne logowanie. Zmiana ich adresów proxy nie rozdziela tego pliku.

Wybierz właściciela cookie, zanim wybierzesz nazwę pliku. Zwykle jest to logiczna sesja zdalna aplikacji: użytkownik lokalny, konkretne konto zdalne i, jeśli to konieczne, osobna przestrzeń robocza. Punkt końcowy proxy to wybór trasy, a nie niezawodny identyfikator sesji. Kilku użytkowników może współdzielić jeden punkt końcowy, a punkt końcowy może rotować wyjścia.

Wczytuj i zapisuj słoik tej samej sesji

Pozwól aplikacji odwzorować uwierzytelnioną sesję na klucz pliku generowany przez serwer. W prywatnym katalogu cookies i zaufanym $sessionKey konfiguracja cURL ma taki kształt:

$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,
]);

Do dozwolonego testu sesji publicznej witryny w sieci zezwalającej na publicznego pośrednika lista proxy HTTP dostarcza kandydujące punkty końcowe. Użyj uchwytu bez skonfigurowanego uwierzytelniania proxy lub zachowanych danych logowania proxy i utrzymuj stan cookies przypisany do zamierzonej sesji. Ten fragment konfiguruje uchwyt; aplikacja wykonuje transfer i sprawdza wynik w zwykłym przepływie żądań. COOKIEFILE wczytuje wcześniejsze cookies sesji. COOKIEJAR wybiera, gdzie uchwyt zapisuje zachowane cookies. Ustawienie tylko pliku wyjściowego nie wczytuje poprzedniego logowania.

Nowa sesja może zacząć się bez pliku. Daj jej pierwszemu transferowi zamierzoną ścieżkę słoika, pozwól witrynie ustanowić cookies i zapisz wynikowy stan na następne żądanie. Katalog cookies musi być zapisywalny dla procesu roboczego aplikacji i pozostawać poza publicznie serwowanym drzewem dokumentów. Nie zamieniaj nazwy użytkownika ani ścieżki podanej przez odwiedzającego w nazwę pliku; odszukaj zaufany klucz na serwerze.

Zapisywanie potrzebuje miejsca w cyklu życia żądania

libcurl zwykle zapisuje słoik podczas czyszczenia uchwytu. Jeśli aplikacja potrzebuje jawnego punktu zapisu po wymianie zdalnej, może zażądać:

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

To zapisuje cookies znane obecnie uchwytowi do jego skonfigurowanego słoika. Zakończ używanie uchwytu dla tej sesji, zanim przypiszesz go do niepowiązanej pracy. Zmiana tylko ścieżki słoika na uchwycie, który już przechowuje cookies Alice, nie jest równoznaczna z utworzeniem czystej sesji Boba.

Odróżniaj też udane pobranie od udanego utrwalenia. Dokumentacja słoika cookies zauważa, że błąd zapisu podczas czyszczenia nie jest zwracany jako zwykły błąd transferu. Sprawdź własność katalogu, uprawnienia i dane diagnostyczne aplikacji, gdy logowanie działa dla jednego żądania, a przy następnym znika.

Równoległe żądania wprowadzają kolejną granicę. Dwaj pracownicy mogą wczytać ten sam stary słoik, niezależnie zmienić swój stan w pamięci, a następnie zapisać różne wyniki. Blokada na sesję lub równoważna serializacja musi obejmować całą sekwencję wczytywania, wymiany i zapisu, jeśli oba żądania dzielą jedno zdalne logowanie; zablokowanie tylko końcowego zapisu nie godzi ich wcześniejszych migawek. Różne sesje powinny mieć różne pliki i niezależne blokady.

Przy wylogowaniu zakończ zamierzoną sesję zdalną i wycofaj jej lokalny stan cookies zgodnie z polityką aplikacji. Nowo wybrane proxy można wtedy przypiąć do dowolnej nowej sesji rozpoczętej przez użytkownika, bez czynienia adresu proxy odpowiedzialnym za decyzję, czyje logowanie jest w pamięci.

Powiązane artykuły