Barattoli dei cookie di PHP cURL per sessioni utente separate
Progettare la persistenza dei cookie di PHP cURL attorno alla sessione remota: nomi di file fidati, salvataggi espliciti e richieste concorrenti.
Un'applicazione PHP serve Alice e Bob, ed entrambi usano il suo client cURL lato server per raggiungere lo stesso sito remoto tramite un proxy. Se ogni richiesta carica cookies.txt, i due utenti possono ereditare lo stesso accesso remoto. Cambiare i loro indirizzi proxy non separa quel file.
Scegli il proprietario del cookie prima di scegliere il nome del file. Di solito è la sessione remota logica dell'applicazione: un utente locale, un determinato account remoto e, dove serve, uno spazio di lavoro separato. Un endpoint proxy è una scelta di instradamento, non un identificatore di sessione affidabile. Più utenti possono condividere un endpoint e un endpoint può ruotare le uscite.
Carica e salva il barattolo della stessa sessione
Lascia che l'applicazione mappi la sua sessione autenticata su una chiave file generata dal server. Con una directory dei cookie privata e un $sessionKey fidato, la configurazione cURL ha questa forma:
$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,
]);
Per un test di sessione consentito su un sito pubblico in una rete che ammette un intermediario pubblico, la lista di proxy HTTP fornisce endpoint candidati. Usa un handle senza autenticazione proxy configurata né credenziali proxy conservate, e mantieni lo stato dei cookie assegnato alla sessione prevista. Questo frammento configura un handle; l'applicazione esegue il trasferimento e verifica il risultato tramite il suo normale flusso di richieste. COOKIEFILE carica i cookie precedenti della sessione. COOKIEJAR seleziona dove l'handle scrive i cookie conservati. Impostare solo il file di output non carica l'accesso precedente.
Una nuova sessione può iniziare senza file. Dai al suo primo trasferimento il percorso del barattolo previsto, lascia che il sito stabilisca i cookie e salva lo stato risultante per la richiesta successiva. La directory dei cookie deve essere scrivibile dal worker dell'applicazione e deve restare fuori dall'albero dei documenti servito pubblicamente. Non trasformare un nome utente o un percorso fornito dal visitatore in un nome di file; cerca la chiave fidata sul server.
Il salvataggio ha bisogno di un posto nel ciclo di vita della richiesta
libcurl di solito scrive il barattolo durante la pulizia dell'handle. Se l'applicazione ha bisogno di un punto di salvataggio esplicito dopo lo scambio remoto, può richiedere:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Questo scrive nel barattolo configurato i cookie attualmente noti all'handle. Termina l'uso dell'handle per quella sessione prima di assegnarlo a lavoro non correlato. Cambiare solo il percorso del barattolo su un handle che contiene già i cookie di Alice non equivale a creare la sessione pulita di Bob.
Distingui anche un download riuscito da una persistenza riuscita. La documentazione del barattolo dei cookie nota che un errore di scrittura durante la pulizia non viene restituito come errore di trasferimento ordinario. Controlla la proprietà della directory, i permessi e l'output diagnostico dell'applicazione quando un accesso funziona per una richiesta e sparisce alla successiva.
Le richieste concorrenti introducono un altro confine. Due worker possono caricare lo stesso vecchio barattolo, modificare indipendentemente il proprio stato in memoria e poi salvare risultati diversi. Un lock per sessione o una serializzazione equivalente deve coprire l'intera sequenza di caricamento, scambio e salvataggio se entrambe le richieste condividono un accesso remoto; bloccare solo la scrittura finale non riconcilia le loro istantanee precedenti. Sessioni diverse dovrebbero avere file diversi e lock indipendenti.
Al logout, termina la sessione remota prevista e ritira il suo stato locale dei cookie secondo la politica dell'applicazione. Un proxy appena selezionato può quindi essere collegato a qualsiasi nuova sessione avviata dall'utente, senza che l'indirizzo del proxy decida di chi sia l'accesso in memoria.