Une application PHP sert Alice et Bob, et tous deux utilisent son client cURL côté serveur pour atteindre le même site distant à travers un proxy. Si chaque requête charge cookies.txt, les deux utilisateurs peuvent hériter de la même connexion distante. Changer leurs adresses de proxy ne sépare pas ce fichier.

Choisissez le propriétaire du cookie avant de choisir le nom de fichier. C'est généralement la session distante logique de l'application : un utilisateur local, un compte distant précis et, si nécessaire, un espace de travail distinct. Un point de terminaison de proxy est un choix de routage, pas un identifiant de session fiable. Plusieurs utilisateurs peuvent partager un point de terminaison, et un point de terminaison peut faire tourner ses sorties.

Charger et enregistrer le pot de la même session

Laissez l'application associer sa session authentifiée à une clé de fichier générée par le serveur. Avec un répertoire de cookies privé et un $sessionKey de confiance, la configuration cURL prend cette forme :

$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,
]);

Pour un test de session autorisé sur un site public, sur un réseau qui permet un intermédiaire public, la liste de proxys HTTP fournit des points de terminaison candidats. Utilisez un handle sans authentification de proxy configurée ni identifiants de proxy conservés, et gardez l'état des cookies affecté à sa session prévue. Ce fragment configure un handle ; l'application effectue le transfert et vérifie son résultat via son flux de requêtes normal. COOKIEFILE charge les cookies précédents de la session. COOKIEJAR sélectionne l'emplacement où le handle écrit ses cookies conservés. Définir uniquement le fichier de sortie ne charge pas la connexion précédente.

Une nouvelle session peut démarrer sans fichier. Donnez à son premier transfert le chemin de pot prévu, laissez le site établir les cookies, et enregistrez l'état obtenu pour la requête suivante. Le répertoire de cookies doit être accessible en écriture au worker de l'application et rester hors de l'arborescence de documents servie publiquement. Ne transformez pas un nom d'utilisateur ou un chemin fourni par un visiteur en nom de fichier ; recherchez la clé de confiance sur le serveur.

L'enregistrement a besoin d'une place dans le cycle de vie de la requête

libcurl écrit normalement le pot lors du nettoyage du handle. Si l'application a besoin d'un point d'enregistrement explicite après l'échange distant, elle peut demander :

curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');

Cela écrit les cookies actuellement connus du handle dans son pot configuré. Terminez l'utilisation du handle pour cette session avant de l'affecter à un travail sans rapport. Changer seulement le chemin du pot sur un handle qui contient déjà les cookies d'Alice n'équivaut pas à créer la session propre de Bob.

Distinguez aussi un téléchargement réussi d'une persistance réussie. La documentation du pot à cookies indique qu'un échec d'écriture pendant le nettoyage n'est pas renvoyé comme une erreur de transfert ordinaire. Vérifiez la propriété du répertoire, les permissions et la sortie de diagnostic de l'application lorsqu'une connexion fonctionne pour une requête et disparaît à la suivante.

Les requêtes concurrentes introduisent une autre frontière. Deux workers peuvent charger le même ancien pot, modifier indépendamment leur état en mémoire, puis enregistrer des résultats différents. Un verrou par session ou une sérialisation équivalente doit couvrir toute la séquence de chargement, d'échange et d'enregistrement si les deux requêtes partagent une connexion distante ; verrouiller seulement l'écriture finale ne réconcilie pas leurs instantanés antérieurs. Des sessions différentes devraient avoir des fichiers différents et des verrous indépendants.

À la déconnexion, terminez la session distante prévue et retirez son état de cookies local selon la politique de l'application. Un proxy récemment sélectionné peut alors être attaché à toute nouvelle session que l'utilisateur démarre, sans que l'adresse du proxy décide à qui appartient la connexion en mémoire.

Articles similaires