121 votes

Comment gérer plusieurs cookies portant le même nom ?

Disons par exemple que j'ai une application qui envoie les en-têtes HTTP suivants pour définir un cookie nommé "a" :

Set-Cookie: a=1;Path=/;Version=1
Set-Cookie: a=2;Path=/example;Version=1

Si j'accède /example sur le serveur, les deux chemins sont valides, j'ai donc deux cookies nommés "a" ! Comme le navigateur n'envoie pas d'informations sur le chemin, les deux cookies ne peuvent pas être distingués.

Cookie: a=2; a=1

Comment traiter cette affaire ? Choisir le premier ? Créer une liste avec toutes les valeurs des cookies ? Ou ce cas doit-il être considéré comme une erreur du développeur ?

2 votes

Je ferais de mon mieux (lire : tout ce que je peux) pour éviter de dupliquer les noms de cookies. La plupart des gens n'ont jamais rencontré ce problème - pour une bonne raison.

0 votes

Le site web ne peut lire que son propre cookie. Il ne peut pas lire le cookie d'un autre site/domaine. Cette sécurité est assurée par le navigateur. Ceci peut être un conseil pour les débutants absolus (j'ai eu cette confusion).

4 votes

@Arun - mais il peut lire les sous-domaines. Et c'est de là que vient généralement la confusion.

121voto

Nate Points 742

La réponse qui fait référence à un article sur SitePoint n'est pas tout à fait complète. Veuillez consulter RFC 6265 (pour être juste, cette RFC a été publiée en 2011 après que cette question ait été postée, ce qui remplace les précédentes RFC 2965 de 2000 et RFC 2109 à partir de 1997).

Section 5.4 le paragraphe 2 est ainsi libellé :

L'agent utilisateur DEVRAIT trier la liste des cookies dans l'ordre suivant :

  • Les cookies dont le parcours est plus long sont énumérés avant les cookies dont le parcours est plus court.

NOTE : Tous les agents utilisateurs ne trient pas la liste des cookies dans cet ordre, mais cet ordre reflète la pratique courante au moment de la rédaction de ce document. mais cet ordre reflète la pratique courante lorsque ce document a été écrit, et, historiquement, il y a eu des serveurs qui dépendaient (à tort) de cet ordre. cet ordre.

Il y a aussi ce petit bijou dans la section 4.2.2 :

... les serveurs NE DOIVENT PAS se fier à l'ordre de sérialisation. Sur En particulier, si l'en-tête Cookie contient deux cookies portant le même nom nom (par exemple, qui ont été définis avec des attributs Path ou Domain différents), les serveurs NE DOIVENT PAS se fier à l'ordre dans lequel ces cookies apparaissent dans l'en-tête.

Dans votre exemple, le cookie de demande ( Cookie : a=2 ; a=1 ), notez que le cookie défini avec le chemin /exemple ( a=2 ) a un chemin plus long que celui de la trajectoire / ( a=1 ) et il vous est donc renvoyé en premier, ce qui correspond à la recommandation de la spécification. Ainsi, vous avez plus ou moins raison de supposer que vous pourrait sélectionner la première valeur.

Malheureusement, le langage utilisé dans les RFC est extrêmement spécifique - l'utilisation des mots DEVRAIT y NE DEVRAIT PAS introduisent des ambiguïtés dans les RFC. Ceux-ci indiquent les conventions qui debe à suivre, mais ne sont pas requis pour être conforme à la spécification. Bien que je comprenne très bien la RFC à ce sujet, je n'ai pas fait de recherches pour voir ce que font les clients du monde réel ; il est possible qu'un ou plusieurs navigateurs ou autres logiciels agissant en tant que clients HTTP n'envoient pas le cookie du chemin le plus long (ex : /exemple ) premier dans la Cookie : en-tête.

Si vous êtes en mesure de contrôler la valeur du cookie et que vous voulez que votre solution soit infaillible, il est préférable de choisir l'une des deux solutions suivantes :

  1. utiliser un nom de cookie différent pour passer outre dans certains chemins, par exemple :
  • Set-cookie : a-global=1;Path=/;Version=1
  • Set-cookie : a-example=2;Path=/example;Version=1
  1. en stockant le chemin dont vous avez besoin dans la valeur du cookie elle-même :
  • Set-cookie : a=1&path=/;Path=/;Version=1
  • Set-cookie : a=2&path=/exemple;Path=/exemple;Version=1

Ces deux solutions de contournement nécessitent une logique supplémentaire sur le serveur pour choisir la valeur de cookie souhaitée, en comparant l'URL demandée à la liste des cookies disponibles. Ce n'est pas très joli. Il est regrettable que la RFC n'ait pas eu la clairvoyance d'exiger qu'un chemin plus long remplace complètement un cookie avec un chemin plus court (par exemple, dans votre exemple, vous recevriez Cookie : a=2 uniquement ).

2 votes

Merci d'avoir extrait cela de ces fichues RFC ! //pourquoi prendre la peine de les lire si personne ne suit ces recommandations

3 votes

Il semble que Wildfly 8.0 fasse attention à l'ordre des cookies et utilise le premier. Cela nous permet d'exécuter une autre application dans un contexte "imbriqué". Cependant, cela échouerait si certains navigateurs ne suivent pas la recommandation de la RFC. La bonne façon de faire est de définir un nom différent pour le cookie de session, comme JSESSIONID2.

5 votes

J'ai testé les principaux navigateurs après avoir lu votre réponse : Chrome 63 / Opera 55 / IE11 / Edge 16 / Safari 11 / Firefox 58 Et ils semblent tous gérer correctement le fait que le cookie avec le chemin le plus long soit avant celui avec le chemin le plus court. Et en PHP (testé sur la version 7), il ne lit que le premier cookie qui est défini dans la variable $_COOKIE.

44voto

Jan M Points 1185

De cet article sur SitePoint :

Si plusieurs cookies du même nom correspondent à une demande URI donnée, le navigateur en choisit un.

Plus le chemin est spécifique, plus la préséance est élevée. Cependant, la préséance basée sur d'autres attributs, y compris le domaine, n'est pas spécifiée et peut varier selon les navigateurs. Cela signifie que si vous avez défini des cookies du même nom pour ".example.org" et "www.example.org", vous ne pouvez pas être sûr de celui qui sera renvoyé.

Edit : cette information de 2010 semble être dépassée, il semble que les navigateurs peuvent maintenant envoyer plusieurs cookies en retour, voir la réponse de @Nate ci-dessous pour plus de détails.

16 votes

Alors comment supprimer les multiples cookies identiques ? J'ai martelé cette question pendant deux jours maintenant et les cookies en double semblent indestructibles.

17 votes

@Brant Cet article est peut-être légèrement incorrect - je viens de voir Chrome renvoyer deux cookies du même nom (mais de chemins différents), donc "l'un est choisi par le navigateur" n'est pas nécessairement vrai. Le cookie du chemin le plus profond a été envoyé en premier, ce qui semble raisonnable. Et un autre cookie a été envoyé entre les deux, également.

5 votes

Firefox (15) envoie aussi deux cookies avec le même nom ! s'il a rencontré avec deux cookies avec pour domaine .a.com et hôte a.com

2voto

Gerard ONeill Points 319

Il n'y a rien de mal à avoir plusieurs valeurs pour le même nom... si vous le souhaitez. Vous pouvez même intégrer un contexte supplémentaire dans la valeur.

Si ce n'est pas le cas, des noms différents sont bien sûr une solution si vous voulez les deux contextes.

L'alternative est d'envoyer le même nom de cookie avec le même chemin (et domaine) même à partir des chemins plus spécifiques. Ces instructions de configuration du cookie écraseront la valeur de ce cookie.

Maintenant que vous connaissez la partie la plus importante (comment ils fonctionnent), et que vous pouvez accomplir ce dont vous avez besoin de plusieurs manières différentes, ma réponse à votre question est la suivante : il s'agit d'un problème de développeur.

1voto

symcbean Points 27412

J'ai connaissance d'applications qui font cela de manière extensive en utilisant plusieurs identifiants de session - et qui semblent fonctionner de manière cohérente. Cependant, je ne sais pas - et je n'ai pas l'intention de le découvrir - s'ils le font parce que le navigateur renvoie les cookies dans un ordre cohérent en fonction du moment où ils ont été créés / du chemin pour lequel ils ont été créés ou si l'application essaie de faire correspondre chacun d'eux à une session existante.

Je recommande vivement d'éviter cette pratique.

Cependant, si vous voulez vraiment savoir comment les navigateurs (et les applications) gèrent ce scénario, pourquoi ne pas construire un banc d'essai et le tester.

2 votes

Un serveur n'a aucun contrôle sur ce qui lui est envoyé par le navigateur. Il doit quand même le traiter.

-2voto

Yoghurt Points 7

Si vous devez les distinguer, vous devez leur donner des valeurs clés différentes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X