Une page web peut enregistrer des informations dans un fichier sur le disque dur du visiteur. Ces informations sont appelées cookies et leur taille et leur nombre est limités. Les cookies permettent d'échanger des informations entre les pages au cours d'une même session de navigation, ou de garder ces informations dans le temps et de les rendre disponibles d'une connexion du client à une autre.
Les spécifications techniques de fonctionnement des cookies sont définies dans la recommandation RFC 2965 : http://www.faqs.org/rfcs/rfc2965
La transmission des cookies du serveur au client et du client au serveur se fait dans un en-tête HTTP. Il faut donc prendre les mêmes précautions que pour les redirections, et encore une fois les mécanismes de bufferisation seront particulièrement utiles.
Tous les dialogues client-serveur contiennent automatiquement dans leurs en-têtes HTTP tous les cookies auxquels une page à accès.
L'envoi de cookie à un navigateur se fait très simplement avec la fonction setcookie().
L'instruction
setcookie('Nom',
'Piat', time()+3600*24, '/', '.monsite.fr');
envoie un
cookie non sécurisé, appelé Nom, qui a la valeur Piat, dont la durée
de vie sera de 24 heures, et qui sera accessible à toutes les pages
du domaine 'site.fr'.
La valeur du cookie est automatiquement encodée URL lors de l'envoi du cookie, et automatiquement décodée lors de la réception du cookie.
La date d'expiration indique la durée de vie du cookie sur le client. Si aucune date n'est donnée, le cookie expire quand l'utilisateur ferme son navigateur. Si une date est donnée, elle doit être un timestamp valide qu'on peut obtenir par exemple avec time(), ou mktime(). La date d'expiration est comparée avec le temps du client qui peut être différent de celui du serveur.
|
Date d'expiration |
Cookie valable |
|
pas spécifiée |
jusqu'à ce que l'utilisateur ferme son navigateur |
|
time()+3600*12 |
12 heures à partir de maintenant |
|
time()+3600*48 |
2 jours à partir de maintenant |
|
mktime(0,0,0,12,31,2020) |
jusqu'au 31 décembre 2020 |
|
time() - 3600 |
le cookie est supprimé car sa date est dépassée |
Le
chemin indique le répertoire du site où le cookie possède une
validité.
|
Chemin |
Accessibilité |
|
pas spécifié |
seules les pages du répertoire de la page qui a défini le cookie ont accès au cookie. |
|
/ |
toutes les pages du domaine ont accès au cookie. |
|
/repert |
seules les pages du répertoire repert et de ses sous-répertoires éventuels ont accès au cookie. |
Le domaine indique le nom DNS du site pour lequel le cookie est accesible. Par défaut, le nom du domaine est celui de la page qui a défini le cookie. La valeur de cet argument doit absolument comporter deux points.
|
Domaine |
Accessibilité |
|
pas spécifié |
seules les pages du sous-domaine de la page qui a défini le cookie ont accès au cookie. |
|
.monsite.fr |
toutes les pages de tous les sous domaine du domaine monsite.fr ont accès au cookie. |
|
www.monsite.fr |
seules les pages du sous-domaine www du domaine monsite.fr ont accès au cookie. |
La sécurisation indique si le cookie doit être transmis avec une connexion sécurisée HTTPS (1) ou avec une connexion HTTP normale (0). La valeur par défaut est 0.
Les cookies écrits par un script ne sont pas accessibles immédiatement à l'intérieur du script. Il faut attendre que HTTP les ait transportés au moins une fois.
Sur le serveur, la récupèration des cookies du client se fait par l'intermédiaire du tableau superglobal $_COOKIE. Les clés du tableau sont les noms des cookies, associées aux valeurs correspondantes.
La manipulation du tableau $_COOKIE n'a
aucune influence sur les cookies.
On pourrait penser qu'en ajoutant
un élement au tableau $_COOKIE :
$_COOKIE['nouveau'] = 'ça marche';
on créait un cookie. Il n'en est rien. Un nouvel
élément sera bien ajouté au tableau, mais aucun cookie de nom nouveau avec la valeur 'ça marche' ne sera créé est envoyé au
client.
De la même façon la modification de la valeur d'un cookie
doit se faire absolument avec la fonction setcookie().
Si par exemple il existe un cookie avec le nom test
et la valeur 1, l'instruction
$_COOKIE['test'] = 2;
n'aura
aucune influence sur la valeur envoyée au client.
Pour supprimer un cookie, la page doit avoir accès au cookie, et il faut utiliser la fonction setcookie() avec strictement les mêmes paramètres que ceux utilisés lors de la création du cookie.
Une valeur non spécifiée, ou vide supprime le cookie :
setcookie('Nom', '');
est
équivalent à
setcookie('Nom');
et supprime le cookie appelé Nom.
On peut aussi définir une date d'expiration dépassée (time() - 3600 par exemple) :
setcookie('Nom', '', time() - 3600);