Frascos de cookies de PHP cURL para sesiones de usuario separadas
Diseñar la persistencia de cookies de PHP cURL en torno a la sesión remota: nombres de archivo de confianza, guardado explícito y solicitudes concurrentes.
Una aplicación PHP atiende a Alice y a Bob, y ambos usan su cliente cURL del lado del servidor para llegar al mismo sitio web remoto a través de un proxy. Si cada solicitud carga cookies.txt, los dos usuarios pueden heredar el mismo inicio de sesión remoto. Cambiar sus direcciones de proxy no separa ese archivo.
Elija el propietario de la cookie antes de elegir el nombre del archivo. Normalmente es la sesión remota lógica de la aplicación: un usuario local, una cuenta remota concreta y, cuando hace falta, un espacio de trabajo separado. Un punto de conexión de proxy es una elección de enrutamiento, no un identificador de sesión fiable. Varios usuarios pueden compartir un punto de conexión, y un punto de conexión puede rotar sus salidas.
Cargue y guarde el frasco de la misma sesión
Deje que la aplicación asigne su sesión autenticada a una clave de archivo generada por el servidor. Con un directorio de cookies privado y un $sessionKey de confianza, la configuración de cURL tiene 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 una prueba de sesión permitida en un sitio público en una red que admite un intermediario público, la lista de proxies HTTP proporciona puntos de conexión candidatos. Use un manejador sin autenticación de proxy configurada ni credenciales de proxy retenidas, y mantenga el estado de las cookies asignado a su sesión prevista. Este fragmento configura un manejador; la aplicación realiza la transferencia y comprueba su resultado mediante su flujo normal de solicitudes. COOKIEFILE carga las cookies anteriores de la sesión. COOKIEJAR selecciona dónde escribe el manejador sus cookies retenidas. Establecer solo el archivo de salida no carga el inicio de sesión anterior.
Una sesión nueva puede empezar sin archivo. Dé a su primera transferencia la ruta de frasco prevista, deje que el sitio establezca las cookies y guarde el estado resultante para la siguiente solicitud. El directorio de cookies debe ser escribible por el trabajador de la aplicación y mantenerse fuera del árbol de documentos servido públicamente. No convierta un nombre de usuario o una ruta proporcionados por el visitante en un nombre de archivo; busque la clave de confianza en el servidor.
El guardado necesita un lugar en el ciclo de vida de la solicitud
libcurl normalmente escribe el frasco durante la limpieza del manejador. Si la aplicación necesita un punto de guardado explícito después del intercambio remoto, puede solicitarlo:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Esto escribe las cookies que el manejador conoce actualmente en su frasco configurado. Termine de usar el manejador para esa sesión antes de asignarlo a trabajo no relacionado. Cambiar solo la ruta del frasco en un manejador que ya contiene las cookies de Alice no equivale a crear la sesión limpia de Bob.
También distinga una descarga correcta de una persistencia correcta. La documentación del frasco de cookies señala que un fallo de escritura durante la limpieza no se devuelve como un error de transferencia ordinario. Compruebe la propiedad del directorio, los permisos y la salida de diagnóstico de la aplicación cuando un inicio de sesión funciona para una solicitud y desaparece en la siguiente.
Las solicitudes concurrentes introducen otra frontera. Dos trabajadores pueden cargar el mismo frasco antiguo, cambiar de forma independiente su estado en memoria y luego guardar resultados distintos. Un bloqueo por sesión o una serialización equivalente debe cubrir toda la secuencia de carga, intercambio y guardado si ambas solicitudes comparten un inicio de sesión remoto; bloquear solo la escritura final no reconcilia sus instantáneas anteriores. Las sesiones distintas deberían tener archivos distintos y bloqueos independientes.
Al cerrar sesión, termine la sesión remota prevista y retire su estado local de cookies según la política de la aplicación. Un proxy recién seleccionado puede entonces asociarse a cualquier sesión nueva que inicie el usuario, sin que la dirección del proxy decida de quién es el inicio de sesión en memoria.