705 votes

Partager le cookie entre le sous-domaine et le domaine

J'ai deux questions. Je comprends que si je spécifie le domaine comme .mydomain.com (avec le point en tête) dans le cookie que tous les sous-domaines peuvent partager un cookie.

Can subdomain.mydomain.com accéder à un cookie créé dans mydomain.com (sin el www sous-domaine) ?

Can mydomain.com (sin el www ) accèdent au cookie s'il a été créé dans un subdomain.mydomain.com ?

3 votes

Oui, vous pouvez voir le lien ci-dessous codeguru.com/csharp/csharp/cs_internet/article.php/c19417/

1 votes

2 votes

Pouvez-vous s'il vous plaît examiner cette question stackoverflow.com/questions/38351769/

1079voto

cbuckley Points 10401

Deux domaines différents (par exemple mydomain.com y subdomain.mydomain.com ou sub1.mydomain.com y sub2.mydomain.com ) ne peuvent partager des cookies que si le domaine est explicitement nommé dans la section Set-Cookie en-tête. Sinon, la portée du cookie est limitée à l'hôte de la demande. (C'est ce qu'on appelle un "cookie d'hôte seulement". Voir Qu'est-ce qu'un cookie d'hôte uniquement ? )

Par exemple, si vous avez envoyé l'en-tête suivant à partir de subdomain.mydomain.com alors le cookie ne sera envoyé que pour les demandes adressées à ce domaine, et ne sera pas envoyé pour les demandes adressées à d'autres domaines :

Set-Cookie: name=value

Cependant, si vous utilisez ce qui suit, il sera utilisable sur les deux domaines :

Set-Cookie: name=value; domain=mydomain.com

Ce cookie sera envoyé pour tout sous-domaine de mondomaine.com, y compris les sous-domaines imbriqués tels que subsub.subdomain.mydomain.com .

En RFC 2109 un domaine sans point initial signifie qu'il ne peut pas être utilisé sur des sous-domaines, et seul un point initial ( .mydomain.com ) permettrait de l'utiliser sur plusieurs sous-domaines (mais pas sur le domaine de premier niveau, ce que vous demandez n'était donc pas possible dans l'ancienne spécification).

Cependant, tous les navigateurs modernes respectent la nouvelle spécification. RFC 6265 et ignorera tout point de tête, ce qui signifie que vous pouvez utiliser le cookie sur des sous-domaines ainsi que sur le domaine de premier niveau.

En résumé, si vous définissez un cookie comme le deuxième exemple ci-dessus à partir de mydomain.com il serait accessible par subdomain.mydomain.com et vice versa. Cela peut également être utilisé pour permettre sub1.mydomain.com y sub2.mydomain.com pour partager les cookies.

Voir aussi :

1 votes

J'avais donc deux questions dans mon message initial. Voulez-vous dire que la réponse est "oui" aux deux, mais seulement sur les navigateurs les plus récents ?

0 votes

Si je configure le cookie à la fois sur subdomain.mydomain.com et mydomain.com, dois-je les configurer en tant que Set-Cookie: name=value; domain=mydomain.com en les deux domaines pour les rendre (les cookies) partagés ?

3 votes

Je ne comprends pas pourquoi vous ne mettez pas simplement le "." en tête du domaine pour une compatibilité maximale avec les anciens et les nouveaux systèmes.

139voto

Accountant م Points 1603

Veuillez noter que vous pouvez définir un cookie à partir d'un sous-domaine sur un domaine.

(envoyé dans la réponse pour la demande de subdomain.mydomain.com )

Set-Cookie: name=value; Domain=mydomain.com // GOOD

Mais vous CAN CAN'S définir un cookie d'un domaine sur un sous-domaine.

(envoyé dans la réponse pour la demande de mydomain.com )

Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie

POURQUOI ?

Selon les spécifications RFC 6265 section 5.3.6 Modèle de stockage

Si l'hôte de la demande canonisée n'est pas domaine de référence l'attribut de domaine : Ignorez le cookie entièrement et abandonnez ces étapes.

et RFC 6265 section 5.1.3 Correspondance de domaine

Correspondance de domaines

Une chaîne de caractères correspond à un domaine donné si au moins une des conditions suivantes est remplie :

  1. La chaîne de domaine et la chaîne de caractères sont identiques. (Notez que les deux la chaîne de domaine et la chaîne de caractères auront été canonisées en en minuscules à ce stade).

  2. Toutes les conditions suivantes sont réunies :

    • La chaîne de domaine est un suffixe de la chaîne.

    • Le dernier caractère de la chaîne de caractères qui n'est pas inclus dans la chaîne de domaine est un caractère %x2E (".").

    • La chaîne est un nom d'hôte (c'est-à-dire pas une adresse IP).

Ainsi, "subdomain.mydomain.com" correspond au domaine "mydomain.com", mais "mydomain.com" ne correspond PAS au domaine "subdomain.mydomain.com".

Vérifiez cette réponse également.

6 votes

C'est la réponse qui m'a le plus aidé.

3 votes

Merci de fournir un documenté qui donne les références RFC expliquant exactement quand les navigateurs sont censés accepter un domaine de cookie, et pourquoi il n'y a pas de problème pour que "foo.domain.com" place un cookie pour "domain.com", même si cela semble violer la "politique de même origine" et pourrait être considéré comme un risque pour la sécurité.

48voto

akostadinov Points 3272

Je ne suis pas sûr que la réponse de @cmbuckley donne une image complète. Ce que je lis est :

À moins que les attributs du cookie n'indiquent le contraire, le cookie est renvoyé uniquement au serveur d'origine (et non, par exemple, à des sous-domaines). sous-domaines) et il expire à la fin de la session en cours (définie par l'agent définie par l'agent utilisateur). Les agents utilisateurs ignorent le cookie non reconnu.

RFC 6265

Aussi

8.6.  Weak Integrity

   Cookies do not provide integrity guarantees for sibling domains (and
   their subdomains).  For example, consider foo.example.com and
   bar.example.com.  The foo.example.com server can set a cookie with a
   Domain attribute of "example.com" (possibly overwriting an existing
   "example.com" cookie set by bar.example.com), and the user agent will
   include that cookie in HTTP requests to bar.example.com.  In the
   worst case, bar.example.com will be unable to distinguish this cookie
   from a cookie it set itself.  The foo.example.com server might be
   able to leverage this ability to mount an attack against
   bar.example.com.

Pour moi, cela signifie que vous pouvez empêcher les cookies d'être lus par le sous-domaine/domaine mais que vous ne pouvez pas empêcher l'écriture de cookies vers les autres domaines. Quelqu'un peut donc réécrire les cookies de votre site en contrôlant un autre sous-domaine visité par le même navigateur. Ce qui n'est peut-être pas un gros problème.

Superbe site de test des cookies fourni par @cmbuckley /pour ceux qui l'ont manqué dans sa réponse comme moi ; cela vaut la peine de le faire défiler et de l'upvoter/ :

5 votes

Cela semble correspondre à ce que je dis : à moins que vous ne spécifiiez une domain le cookie n'est utilisé que pour l'hôte de la demande. Cela signifie que Set-Cookie: name=value de mydomain.com ne sera pas envoyé avec les requêtes aux sous-domaines. Jouez avec ce test script también.

0 votes

@cmbuckley, ok, ce que vous avez dit semble correct. Je vais reformuler ma réponse. Merci de me l'avoir fait remarquer.

0 votes

Il faut souligner que la section 4.1.2 (première citation) n'est pas normative...

31voto

llambda Points 91

Voici un exemple utilisant l'API des cookies DOM ( https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie ), afin que nous puissions voir par nous-mêmes le comportement.

Si nous exécutons le JavaScript suivant :

document.cookie = "key=value" (clé=valeur)

Il semble que ce soit la même chose que l'exécution :

document.cookie = "key=value;domain=mydomain.com"

Le cookie clé devient disponible (uniquement) sur le domaine mondomaine.com .


Maintenant, si vous exécutez le JavaScript suivant sur mydomain.com :

document.cookie = "key=value;domain=.mydomain.com"

Le cookie clé devient disponible pour mondomaine.com ainsi que sous-domaine.mondomaine.com .


Enfin, si vous essayez d'exécuter la commande suivante sur subdomain.mydomain.com :

document.cookie = "key=value;domain=.mydomain.com"

Est-ce que le cookie clé deviennent disponibles pour sous-domaine.mondomaine.com ? J'ai été un peu surpris que cela soit autorisé ; j'avais supposé que ce serait une violation de la sécurité pour un sous-domaine de pouvoir définir un cookie sur un domaine parent.

2 votes

Cela m'amène à me demander s'il existe des spécifications distinctes décrivant le comportement de la fonction httponly des cookies par rapport au type de cookies que vous créez.

4 votes

Les documents que vous avez postés ne correspondent pas aux déclarations que vous faites. Les 2 premiers exemples sont pas équivalent (un domain permet au cookie de fonctionner sur les sous-domaines ; l'absence d'un tel attribut ne le permet pas). Les points en tête sont au mieux ignorés et au pire activement bloqués.

0 votes

C'est la meilleure solution si vous ne voulez pas compter sur les en-têtes d'hôtes. Je l'ai vérifié et cela fonctionne

6voto

Alexandre97122 Points 23

Attention si vous travaillez sur localhost ! Si vous stockez votre cookie en js comme ceci :

document.cookie = "key=value;domain=localhost"

Il se peut qu'il ne soit pas accessible à votre sous-domaine, par exemple sub.localhost . Afin de résoudre ce problème, vous devez utiliser Hôte virtuel . Par exemple, vous pouvez configurer votre hôte virtuel comme suit ServerName localhost.com alors vous pourrez stocker votre cookie sur votre domaine et sous-domaine comme ceci :

document.cookie = "key=value;domain=localhost.com"

0 votes

AHA ! Peut-être que c'est mon problème.

1 votes

Sous Windows, vous pouvez simplement modifier votre hosts et définissez l'alias que vous voulez pour localhost. Par exemple, local.mydomain.com .

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