Projet

Général

Profil

Anomalie #6904

Le Set-Cookie pour supprimer le cookie ne spécifie pas de path

Ajouté par Jérôme Augé il y a plus de 2 ans. Mis à jour il y a plus d'un an.

Statut:
Intégré
Priorité:
Normal
Assigné à:
Version cible:
Début:
01/12/2016
Echéance:
% réalisé:

100%

Version source:
Solution proposée:

Solution 2)

Principaux fichiers impactés:
Complexité:
Contrôle:
Thème:
Socle technique
Régression:
Non
Jalons: 3.2 R17

Description

Le client Gatling ne peut pas se logger correctement sur Dynacase.

- Le client soumet user/password pour se logger :

POST /test/authent.php?sole=A&app=AUTHENT&action=CHECKAUTH HTTP/1.1
[...]

- Le serveur répond avec la suppression de dcpsession (dcpsession=deleted) et donne le nouveau dcpsession (dcpsession=aebb6d68de55fb8fbdb8fd25d7257054)

HTTP/1.1 302 Found
[...]
Set-Cookie: dcpsession=f8d82a9d180a554354c18d09f173c972; expires=Thu, 01-Dec-2016 11:52:08 GMT; path=/test/; httponly
Set-Cookie: dcpsession=f8d82a9d180a554354c18d09f173c972; expires=Thu, 01-Dec-2016 11:52:08 GMT; path=/test/; httponly
Set-Cookie: dcpsession=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; httponly
Set-Cookie: dcpsession=aebb6d68de55fb8fbdb8fd25d7257054; expires=Thu, 01-Dec-2016 11:52:08 GMT; path=/test/; httponly
[...]
Location: /test/
[...]

- Le client suit le redirect et charge "/test/" en soumettant deux valeurs pour le cookie "dcpsession" : "deleted" et la valeur qu'on s'attend à avoir "aebb6d68de55fb8fbdb8fd25d7257054" :

GET /test/ HTTP/1.1
[...]
Cookie: dcpsession=deleted; dcpsession=aebb6d68de55fb8fbdb8fd25d7257054
[...]

- Comme le cookie est pris dans la variable $_COOKIE qui ne permet pas d'avoir des entrées avec la même clef, le code PHP se retrouve avec la première valeur qui vaut "deleted", il refuse donc l'accès et redirige le client vers la page de login.

Le problème semble être que lors de la suppression du cookie "dcpsession", le path n'est pas spécifié et le client stocke alors deux valeurs pour dcpsession : une en global qui vaut "deleted", et une précise pour le path "/test/" qui vaut la valeur attendu "aebb6d68de55fb8fbdb8fd25d7257054".

Au niveau HTTP il semble qu'il ne soit pas interdit pour un client (ou un serveur) d'avoir deux cookies avec le même nom...

J'ai testé deux solutions de contournement :
- Si la valeur est du cookie est "deleted", alors je parse _SERVER['HTTP_COOKIE'] et extraire le premier dcpsession formé de 32 hex-chars.
- Sinon on peut "corriger" Class.Session.php pour faire la deletion avec un path

Set-Cookie: dcpsession=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/test/; httponly
                                                                       ^^^^^^^^^^^^

Dans les deux cas, le client Gatling peut alors se connecter correctement.

Références :
- http://stackoverflow.com/questions/4056306/how-to-handle-multiple-cookies-with-the-same-name#answer-24214538
- https://tools.ietf.org/html/rfc6265

Historique

#1 Mis à jour par Jérôme Augé il y a plus de 2 ans

dynacase-core 3.2.20 ne semble pas avoir ce problème puisque Gatling peut s'y connecter sans problèmes.

#2 Mis à jour par Marc Claverie il y a plus d'un an

  • Solution proposée mis à jour (diff)
  • Version cible mis à 3.2.23
  • Assigné à mis à Jérôme Augé

#4 Mis à jour par Jérôme Augé il y a plus d'un an

  • % réalisé changé de 0 à 100

#5 Mis à jour par Éric Brison il y a plus d'un an

  • Statut changé de Nouveau à Intégré

Appliqué par commit internal-platfrom:commit:2e51af6a0bd250bfa2a93ec2d26f765a194b9b20.

Formats disponibles : Atom PDF