Potes de cookies do PHP cURL para sessões de usuário separadas
Projetar a persistência de cookies do PHP cURL em torno da sessão remota: nomes de arquivo confiáveis, gravação explícita e requisições concorrentes.
Uma aplicação PHP atende Alice e Bob, e ambos usam o cliente cURL do lado do servidor para alcançar o mesmo site remoto por meio de um proxy. Se cada requisição carrega cookies.txt, os dois usuários podem herdar o mesmo login remoto. Mudar os endereços de proxy deles não separa esse arquivo.
Escolha o dono do cookie antes de escolher o nome do arquivo. Normalmente é a sessão remota lógica da aplicação: um usuário local, uma conta remota específica e, quando necessário, um espaço de trabalho separado. Um endpoint de proxy é uma escolha de roteamento, não um identificador de sessão confiável. Vários usuários podem compartilhar um endpoint, e um endpoint pode alternar saídas.
Carregue e grave o pote da mesma sessão
Deixe a aplicação mapear sua sessão autenticada para uma chave de arquivo gerada pelo servidor. Com um diretório de cookies privado e um $sessionKey confiável, a configuração do cURL tem este formato:
$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 um teste de sessão permitido em um site público numa rede que admite um intermediário público, a lista de proxies HTTP fornece endpoints candidatos. Use um handle sem autenticação de proxy configurada ou credenciais de proxy retidas e mantenha o estado dos cookies atribuído à sessão pretendida. Este trecho configura um handle; a aplicação realiza a transferência e verifica o resultado pelo seu fluxo normal de requisições. COOKIEFILE carrega cookies anteriores da sessão. COOKIEJAR seleciona onde o handle grava os cookies retidos. Definir apenas o arquivo de saída não carrega o login anterior.
Uma nova sessão pode começar sem arquivo. Dê à primeira transferência o caminho de pote pretendido, deixe o site estabelecer os cookies e salve o estado resultante para a próxima requisição. O diretório de cookies deve ser gravável pelo worker da aplicação e mantido fora da árvore de documentos servida publicamente. Não transforme um nome de usuário ou caminho fornecido pelo visitante em nome de arquivo; procure a chave confiável no servidor.
A gravação precisa de um lugar no ciclo de vida da requisição
O libcurl normalmente grava o pote durante a limpeza do handle. Se a aplicação precisa de um ponto de gravação explícito após a troca remota, pode solicitar:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
Isso grava os cookies atualmente conhecidos pelo handle no pote configurado. Termine o uso do handle para essa sessão antes de atribuí-lo a trabalho não relacionado. Mudar apenas o caminho do pote em um handle que já contém os cookies de Alice não equivale a criar a sessão limpa de Bob.
Distinga também um download bem-sucedido de uma persistência bem-sucedida. A documentação do pote de cookies observa que uma falha de escrita durante a limpeza não é retornada como erro de transferência comum. Verifique a propriedade do diretório, as permissões e a saída de diagnóstico da aplicação quando um login funciona para uma requisição e desaparece na seguinte.
Requisições concorrentes introduzem outra fronteira. Dois workers podem carregar o mesmo pote antigo, alterar independentemente seu estado em memória e então salvar resultados diferentes. Um bloqueio por sessão ou serialização equivalente deve cobrir toda a sequência de carregamento, troca e gravação se as duas requisições compartilham um login remoto; bloquear apenas a escrita final não reconcilia seus instantâneos anteriores. Sessões diferentes devem ter arquivos diferentes e bloqueios independentes.
No logout, encerre a sessão remota pretendida e aposente seu estado local de cookies conforme a política da aplicação. Um proxy recém-selecionado pode então ser associado a qualquer nova sessão que o usuário inicie, sem que o endereço do proxy decida de quem é o login na memória.