Frascos de cookies de PHP cURL para sesións de usuario separadas
Deseñar a persistencia de cookies de PHP cURL arredor da sesión remota: nomes de ficheiro de confianza, gardado explícito e solicitudes simultáneas.
Unha aplicación PHP atende a Alice e a Bob, e ambos usan o seu cliente cURL do lado do servidor para chegar ao mesmo sitio web remoto a través dun proxy. Se cada solicitude carga cookies.txt, os dous usuarios poden herdalo mesmo inicio de sesión remoto. Cambiar os seus enderezos de proxy non separa ese ficheiro.
Escolle o propietario da cookie antes de escoller o nome do ficheiro. Normalmente é a sesión remota lóxica da aplicación: un usuario local, unha conta remota concreta e, cando é necesario, un espazo de traballo separado. Un punto de conexión de proxy é unha elección de enrutamento, non un identificador de sesión fiable. Varios usuarios poden compartir un punto de conexión, e un punto de conexión pode rotar as saídas.
Carga e garda o frasco da mesma sesión
Deixa que a aplicación asigne a súa sesión autenticada a unha clave de ficheiro xerada polo servidor. Cun directorio de cookies privado e un $sessionKey de confianza, a configuración de cURL ten esta 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,
]);
Para unha proba de sesión permitida nun sitio público nunha rede que admite un intermediario público, a lista de proxies HTTP fornece puntos de conexión candidatos. Usa un manexador sen autenticación de proxy configurada nin credenciais de proxy retidas, e mantén o estado das cookies asignado á súa sesión prevista. Este fragmento configura un manexador; a aplicación realiza a transferencia e comproba o resultado mediante o seu fluxo normal de solicitudes. COOKIEFILE carga as cookies anteriores da sesión. COOKIEJAR selecciona onde o manexador escribe as súas cookies retidas. Establecer só o ficheiro de saída non carga o inicio de sesión anterior.
Unha sesión nova pode comezar sen ficheiro. Dálle á súa primeira transferencia a ruta de frasco prevista, deixa que o sitio estableza as cookies e garda o estado resultante para a seguinte solicitude. O directorio de cookies debe ser escribible polo traballador da aplicación e manterse fóra da árbore de documentos servida publicamente. Non converte un nome de usuario ou unha ruta proporcionados polo visitante nun nome de ficheiro; busca a clave de confianza no servidor.
O gardado necesita un lugar no ciclo de vida da solicitude
libcurl normalmente escribe o frasco durante a limpeza do manexador. Se a aplicación necesita un punto de gardado explícito despois do intercambio remoto, pode solicitar:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Isto escribe as cookies que o manexador coñece actualmente no seu frasco configurado. Remata de usar o manexador para esa sesión antes de asignalo a traballo non relacionado. Cambiar só a ruta do frasco nun manexador que xa contén as cookies de Alice non equivale a crear a sesión limpa de Bob.
Distingue tamén unha descarga correcta dunha persistencia correcta. A documentación do frasco de cookies sinala que un fallo de escritura durante a limpeza non se devolve como un erro de transferencia ordinario. Comproba a propiedade do directorio, os permisos e a saída de diagnóstico da aplicación cando un inicio de sesión funciona para unha solicitude e desaparece na seguinte.
As solicitudes simultáneas introducen outra fronteira. Dous traballadores poden cargar o mesmo frasco antigo, cambiar de forma independente o seu estado en memoria e logo gardar resultados distintos. Un bloqueo por sesión ou unha serialización equivalente debe cubrir toda a secuencia de carga, intercambio e gardado se ambas as solicitudes comparten un inicio de sesión remoto; bloquear só a escritura final non concilia as súas instantáneas anteriores. Sesións distintas deberían ter ficheiros distintos e bloqueos independentes.
Ao pechar a sesión, remata a sesión remota prevista e retira o seu estado local de cookies segundo a política da aplicación. Un proxy recentemente seleccionado pode entón asociarse a calquera sesión nova que inicie o usuario, sen que o enderezo do proxy decida de quen é o inicio de sesión en memoria.