Borcane de cookie PHP cURL pentru sesiuni de utilizator separate
Proiectarea persistenței cookie-urilor PHP cURL în jurul sesiunii la distanță: nume de fișiere de încredere, salvări explicite și cereri concurente.
O aplicație PHP o deservește pe Alice și pe Bob, iar amândoi folosesc clientul cURL pe partea de server pentru a ajunge la același site la distanță printr-un proxy. Dacă fiecare cerere încarcă cookies.txt, cei doi utilizatori pot moșteni același login la distanță. Schimbarea adreselor lor de proxy nu separă acel fișier.
Alegeți proprietarul cookie-ului înainte de a alege numele fișierului. De obicei este sesiunea la distanță logică a aplicației: un utilizator local, un anumit cont la distanță și, unde este nevoie, un spațiu de lucru separat. Un endpoint de proxy este o alegere de rutare, nu un identificator de sesiune de încredere. Mai mulți utilizatori pot partaja un endpoint, iar un endpoint poate roti ieșirile.
Încărcați și salvați borcanul aceleiași sesiuni
Lăsați aplicația să-și mapeze sesiunea autentificată la o cheie de fișier generată de server. Cu un director privat de cookie-uri și un $sessionKey de încredere, configurația cURL are această 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,
]);
Pentru un test de sesiune permis pe un site public într-o rețea care permite un intermediar public, lista de proxy-uri HTTP oferă endpoint-uri candidate. Folosiți un handle fără autentificare de proxy configurată sau credențiale de proxy reținute și păstrați starea cookie-urilor atribuită sesiunii dorite. Acest fragment configurează un handle; aplicația efectuează transferul și verifică rezultatul prin fluxul său normal de cereri. COOKIEFILE încarcă cookie-urile anterioare ale sesiunii. COOKIEJAR selectează unde scrie handle-ul cookie-urile reținute. Setarea doar a fișierului de ieșire nu încarcă login-ul anterior.
O sesiune nouă poate începe fără fișier. Dați primului transfer calea borcanului dorită, lăsați site-ul să stabilească cookie-urile și salvați starea rezultată pentru următoarea cerere. Directorul de cookie-uri trebuie să fie scriibil de lucrătorul aplicației și păstrat în afara arborelui de documente servit public. Nu transformați un nume de utilizator sau o cale furnizată de vizitator într-un nume de fișier; căutați cheia de încredere pe server.
Salvarea are nevoie de un loc în ciclul de viață al cererii
libcurl scrie de obicei borcanul în timpul curățării handle-ului. Dacă aplicația are nevoie de un punct de salvare explicit după schimbul la distanță, poate solicita:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Aceasta scrie cookie-urile cunoscute în prezent de handle în borcanul său configurat. Terminați utilizarea handle-ului pentru acea sesiune înainte de a-l atribui unei lucrări nelegate. Schimbarea doar a căii borcanului pe un handle care deține deja cookie-urile lui Alice nu este echivalentă cu crearea sesiunii curate a lui Bob.
De asemenea, distingeți o descărcare reușită de o persistență reușită. Documentația borcanului de cookie-uri notează că o eroare de scriere în timpul curățării nu este returnată ca o eroare obișnuită de transfer. Verificați proprietatea directorului, permisiunile și ieșirea de diagnostic a aplicației când un login funcționează pentru o cerere și dispare la următoarea.
Cererile concurente introduc o altă frontieră. Doi lucrători pot încărca același borcan vechi, își pot modifica independent starea din memorie și apoi pot salva rezultate diferite. O blocare pe sesiune sau o serializare echivalentă trebuie să acopere întreaga secvență de încărcare, schimb și salvare dacă ambele cereri partajează un login la distanță; blocarea doar a scrierii finale nu reconciliază instantaneele lor anterioare. Sesiunile diferite ar trebui să aibă fișiere diferite și blocări independente.
La deconectare, încheiați sesiunea la distanță dorită și retrageți starea locală a cookie-urilor conform politicii aplicației. Un proxy nou selectat poate fi apoi atașat oricărei sesiuni noi pe care o începe utilizatorul, fără ca adresa proxy să decidă al cui login este în memorie.