Cookies et les domaines

Visibilité des cookies entre domaines

D’une manière générale, un cookie n’est visible que pour le domaine pour lequel, et par lequel il a été émis. Le navigateur applique la « politique de la même source ».

Plus précisément, un cookie d’un domaine est visible sur ses sous domaines. Le contraire n’est pas vrai. Un cookie d’un sous domaine n’est pas visible à partir d’un domaine de plus haut niveau De plus, il est impossible à partir d’un domaine de plus haut niveau d’écrire un cookie sur un sous domaine. Il est en revanche autorisé pour un sous domaine positionner un cookie sur son sur domaine.

En résumé, un domaine de plus haut niveau ne peut rien faire sur un sous domaine.

Attribut domain du cookie

Lors de la réception du cookie, si ce dernier ne possède pas d’attribut domain le domaine du cookie est celui de la requête. Si l’attribut domain est renseigné de manière valide, sa valeur sera préfixée par le navigateur d’un « . » avant d’être utilisée.
Le navigateur refuse tous les cookies dont l’attribut domain ne correspond pas au domaine effectif de la requête. Les mêmes règles s’applique lors de l’envoi des cookies. Cela interdit aux sites de écrire / lire des cookies qui ne leur sont pas destinés.

Point en tant que préfixe du domaine

Le point préfixant le domaine du cookie signifie que ce dernier sera accessible par les sous domaines. Ainsi un cookie ayant pour domaine .jerep6.fr sera visible sur www.jerep6.fr. Un cookie dont l’attribut domain est « jerep6.fr » ne sera quant à lui pas disponible sur le domaine www.jerep6.fr du fait de l’absence du point au début de l’attribut domain.
Lorsque un cookie a un attribut domain ne commençant pas par un point, le navigateur se charge de rajouter un point au début. Si le cookie ne possède pas d’attribut domain le navigateur ne fait rien.
Extrait de la RFC 6265 :

Domain=value
      OPTIONAL.  The value of the Domain attribute specifies the domain
      for which the cookie is valid.  If an explicitly specified value
      does not start with a dot, the user agent supplies a leading dot.

En PHP, pour positionner un cookie uniquement sur le domaine courant (sans point au début), il suffit de ne pas renseigner (ie : chaîne vide) le paramètre domain de la fonction setcookie.

Tableau récapitulatif

Le tableau suivant se lit de la sorte. À partir du domaine jerep6.fr il n’est pas possible de manipuler les cookies du domaine www.jerep6.fr (dernière ligne)

Domaine du cookie

Manipulation (Lecture / Écriture) à partir de

jerep6.fr

www.jerep6.fr

www2.jerep6.fr

.jerep6.fr Oui Oui Oui
jerep6.fr Oui Non Non
.www.jerep6.fr Non Oui Non
www.jerep6.fr Non Oui Non

Tous les navigateurs ne se comportent pas de la même façon car ils n’implémentent pas tous la RFC
Par exemple Konqueror (v4.9.4) autorise un domaine à écrire des cookies sur un sous domaine. À partir du domaine jerep6.fr, je suis parvenu à écrire un cookie ayant pour domaine « .www.jerep6.fr. »
Avec IE 7 en étant sur le domaine www.jerep6.fr, je vois les cookies du domaine jerep6.fr.

Test d’envoi et de réception d’un cookie

J’ai réalisé un petit test afin de répondre aux affirmations avancées dans le paragraphe précédent.
Le code suivant envoie trois cookies au client.

<?php
 $value = 'cookie value';
// Cookie valable uniquement sur le sous domaine www.jerep6.fr
 setcookie ("cookieWWW", $value, 0, "/","www.jerep6.fr");
 // Cookie valable sur le domaine jerep6 ainsi que sur les sous domaines
 setcookie ("cookieRoot", $value, 0, "/","jerep6.fr");
 // Cookie positionné sans indiquer le domaine
 setcookie ("cookieNoDomainSet", $value, 0, "/","");
 echo "<pre>";
 print_r($_COOKIE);
 echo "</pre>";
 ?>

Ce code est appelé à partir du domaine racine (jerep6.fr). Il en résulte donc que seuls les deux derniers cookies seront valables sur le client. En effet, un domaine ne peut pas positionner un cookie sur un sous domaine. Mais qui implémente cette règle ? Le serveur web ou le navigateur ?

La réponse envoyé par le serveur web contient les trois cookies. Le cookie mailplan est rajouté par OVH.
Extrait de la réponse HTTP reçue :
cookies http header wireshark
Le serveur web renvoie tous les cookies positionnés. Il est donc possible d’envoyer au client un cookie d’un autre site. Par exemple, le site evil.com peut créer un cookie avec le domaine good.com. Lors de la consultation du site evil.com, votre navigateur recevra un cookie ayant pour domaine good.com.
Notez que le domaine des cookies n’est pas préfixé par un point (conforme au code php).

Une fois la réponse HTTP reçue le navigateur (user agent) trie les cookies pour ne conserver que ceux qu’il juge valable. Ainsi, les cookies ne correspondant pas au domaine courant sont rejetés. Pour cela, il y a une distinction en l’attribue Domain du header HTTP (Set-Cookie) et le domaine réel.
La RFC 6265 dit :

   The user agent will reject cookies unless the Domain attribute
   specifies a scope for the cookie that would include the origin
   server. For example, the user agent will accept a cookie with a
   Domain attribute of "example.com" or of "foo.example.com" from
   foo.example.com, but the user agent will not accept a cookie with a
   Domain attribute of "bar.example.com" or of "baz.foo.example.com".

   NOTE: For security reasons, many user agents are configured to reject
   Domain attributes that correspond to "public suffixes".  For example,
   some user agents will reject Domain attributes of "com" or "co.uk".

Au final, sur mon navigateur (Firefox) à partir d’une url jerep6.fr je n’ai que 2 cookies. Le navigateur n’a donc pas accepté le cookie dont l’attribut domain était www.jerep6.fr. Notez que le domaine du cookie « CookieRoot»  a été préfixé par le navigateur. Pour ce cookie, le code php et la réponse HTPP ne précisait pas de point au début.

Capture d’écran des cookies reçus :
cookies manager

 

Sources
http://tools.ietf.org/html/rfc6265
http://stackoverflow.com/questions/2285010/php-setcookie-domain
http://stackoverflow.com/questions/9618217/what-does-the-dot-prefix-in-the-cookie-domain-mean
http://stackoverflow.com/questions/8805958/how-browsers-know-what-cookies-to-send-to-server-when-requesting
http://stackoverflow.com/questions/1062963/how-do-browser-cookie-domains-work

Laisser un commentaire


1 × = six


NOTE - Vous pouvez utiliser les éléments et attributs HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>