web-dev-qa-db-fra.com

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 d’origine) dans le cookie, tous les sous-domaines peuvent partager un cookie.

Est-ce que subdomain.mydomain.com peut accéder à un cookie créé dans mydomain.com (sans le sous-domaine www)?

Est-ce que mydomain.com (sans le sous-domaine www) peut accéder au cookie s'il a été créé dans subdomain.mydomain.com?

349
adam0101

Les deux domaines mydomain.com et subdomain.mydomain.com ne peuvent partager des cookies que si le domaine est explicitement nommé dans l'en-tête Set-Cookie. Sinon, la portée du cookie est limitée à l'hôte de la demande. (Ceci est appelé "cookie hôte uniquement". Voir Qu'est-ce qu'un cookie hôte uniquement? )

Par exemple, si vous avez envoyé l'en-tête suivant depuis subdomain.mydomain.com, le cookie ne sera pas envoyé pour les demandes adressées à mydomain.com:

Set-Cookie: name=value

Toutefois, 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 tous les sous-domaines de mydomain.com, y compris les sous-domaines imbriqués tels que subsub.subdomain.mydomain.com.

Dans RFC 2109 , un domaine sans point principal signifiait qu'il ne pouvait pas être utilisé sur des sous-domaines et que seul un point principal (.mydomain.com) permettait de l'utiliser à travers plusieurs sous-domaines (mais pas le domaine de premier niveau, donc ce que vous demandez n’était pas possible dans l’ancienne spécification).

Cependant, tous les navigateurs modernes respectent la nouvelle spécification RFC 6265 , et ignorent tous les points, ce qui signifie que vous pouvez utiliser le cookie sur les sous-domaines ainsi que sur le domaine de niveau supérieur.

En résumé, si vous définissez un cookie comme le deuxième exemple ci-dessus tiré de mydomain.com, il sera accessible par subdomain.mydomain.com, et inversement. Ceci peut également être utilisé pour permettre à sub1.mydomain.com et sub2.mydomain.com de partager des cookies.

Voir également:

543
cmbuckley

Je ne suis pas sûr que la réponse de @cmbuckley montre l'image complète. Ce que j'ai lu c'est:

Sauf indication contraire des attributs du cookie, celui-ci est renvoyé uniquement au serveur d'origine (et par exemple à aucun sous-domaine) et il expire à la fin de la session en cours (comme défini par l'agent utilisateur). Les agents utilisateurs ignorent les cookies non reconnus.

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 protéger les cookies contre la lecture par sous-domaine/domaine, mais vous ne pouvez pas empêcher l'écriture de cookies sur les autres domaines. Ainsi, quelqu'un peut réécrire les cookies de votre site en contrôlant un autre sous-domaine visité par le même navigateur. Ce qui pourrait ne pas être une grande préoccupation.

Super site de test de cookies fourni par @cmbuckley/pour ceux qui l'ont raté dans sa réponse, comme moi; vaut la peine de faire défiler et de voter /:

27
akostadinov

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

Si nous exécutons le JavaScript suivant:

document.cookie = "clé = valeur"

Cela semble être la même chose que d’exécuter:

document.cookie = "clé = valeur; domaine = mydomain.com"

Le bouton cookie est disponible (uniquement) sur le domaine mydomain.com . .


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

document.cookie = "clé = valeur; domaine = .mondomaine.com"

Le bouton cookie devient disponible pour mydomain.com ainsi que subdomain.mydomain.com .


Enfin, si vous deviez essayer d’exécuter ce qui suit sur subdomain.mydomain.com:

document.cookie = "clé = valeur; domaine = .mondomaine.com"

Est-ce que la clé cookie devient disponible pour subdomain.mydomain.com ? J'ai été un peu surpris que cela soit autorisé; J'avais supposé que la définition d'un cookie sur un domaine parent constituerait une violation de sécurité pour un sous-domaine.

16
llambda

Dans les deux cas, oui, c'est le comportement par défaut pour IE et Edge.

Les autres réponses apportent des informations précieuses, mais décrivent principalement le comportement dans Chrome. il est important de noter que le comportement est complètement différent dans IE. Le script de test très utile de CMBuckley montre que dans (par exemple) Chrome, les cookies ne sont pas partagés entre la racine et les sous-domaines lorsqu'aucun domaine n'est spécifié. Cependant, le même test dans IE montre qu'ils sont partagés. Ce cas IE se rapproche davantage de la description de la maison dans le lien www-or-not-www de CMBuckley. Je sais que cela est le cas, car nous avons un système qui utilise différents cookies servicestack à la fois sur le domaine racine et le sous-domaine. Tout a bien fonctionné jusqu'à ce que quelqu'un y accède dans IE et que les deux systèmes se disputent pour savoir quel cookie de session gagnerait jusqu'à ce que nous fassions sauter le cache.

3
DannyW