Dans ce chapitre, nous allons voir le principe des cookies et leur utilisation en PHP. L'objectif est de comprendre comment une petite information peut être conservée côté navigateur, puis renvoyée automatiquement au serveur lors des requêtes suivantes.
Comprendre le fonctionnement des cookies
Un cookie permet de sauvegarder une petite quantité d'informations dans le navigateur de l'utilisateur. À chaque nouvelle requête vers le même site, le navigateur renvoie automatiquement ces informations au serveur.
C'est ce mécanisme qui permet, par exemple, de rester connecté lorsque l'on passe d'une page à une autre sur un site. Dans les échanges HTTP, on retrouve deux éléments importants :
- pour définir un cookie, le serveur renvoie une entête
Set-Cookie. - pour relire les cookies, le navigateur renvoie une entête
Cookielors des requêtes suivantes.
Un cookie contient généralement :
- un nom.
- une valeur.
- un domaine associé.
- un chemin.
- une date d'expiration.
- une taille.
On ne peut pas définir un cookie pour un domaine qui ne nous appartient pas. Par exemple, un site chargé depuis google.com ne peut définir des cookies que pour google.com.
Le chemin permet de restreindre le cookie à une partie du site. Une fois la date d'expiration passée, le navigateur supprimera automatiquement le cookie.
Définir un cookie en PHP
En PHP, on pourrait envoyer manuellement une entête avec header, mais ce n'est pas très pratique pour les cookies, car l'entête contient plusieurs informations. On utilise donc la fonction setcookie, qui génère l'entête Set-Cookie pour nous.
Les paramètres les plus importants sont :
- le nom du cookie.
- sa valeur.
- sa date d'expiration.
La valeur doit être une chaîne de caractères. On ne peut pas y mettre directement un tableau ou une structure complexe.
Pour la date d'expiration, PHP attend un timestamp Unix, c'est-à-dire le nombre de secondes écoulées depuis le 1er janvier 1970. On peut utiliser time() pour obtenir la date actuelle, puis ajouter une durée.
Si on ne précise pas de date d'expiration, ou si elle vaut 0, le cookie expire à la fin de la session, c'est-à-dire lorsque l'utilisateur quitte son navigateur.
La plupart du temps, on utilisera seulement les trois premiers paramètres. Si on ne précise pas le domaine et le chemin, PHP utilisera le domaine actuel et le chemin racine.
Lire les cookies
Pour lire les cookies envoyés par le navigateur, PHP met à disposition la superglobale $_COOKIE.
Si un cookie utilisateur contient la valeur John, on pourra le récupérer comme ceci :
On vérifiera généralement que la valeur existe avant de l'utiliser :
Attention aux entêtes HTTP
setcookie manipule les entêtes HTTP. Il doit donc être appelé avant tout affichage de contenu.
Si du contenu est affiché avant l'appel à setcookie, PHP peut renvoyer une erreur du type :
La réponse HTTP est envoyée en deux temps :
- d'abord les entêtes.
- ensuite le contenu.
Dès qu'un contenu est envoyé, même un simple espace avant <?php, PHP considère que les entêtes ont déjà été transmises. Il faut donc faire les traitements liés aux cookies tout en haut du fichier, avant d'inclure un header HTML ou d'afficher quoi que ce soit.
Supprimer un cookie
Il n'existe pas de fonction clearcookie en PHP. Pour supprimer un cookie, on redéfinit le cookie avec une date d'expiration dans le passé.
Si on veut aussi que la valeur disparaisse immédiatement pendant l'exécution du script, on peut supprimer la clé dans $_COOKIE avec unset.
unset ne supprime pas le cookie dans le navigateur. Il supprime seulement la valeur dans le tableau $_COOKIE pour la suite de l'exécution du script.
Sauvegarder des données plus complexes
Un cookie ne stocke qu'une chaîne de caractères. Si on veut sauvegarder une petite information plus complexe, comme un tableau, on peut la transformer en chaîne avec serialize, puis la récupérer avec unserialize.
Pour relire la valeur :
Cette approche peut être utile pour de petites informations, mais il faut garder en tête que les cookies sont limités en taille. Dans la vidéo, la limite évoquée est généralement de l'ordre de 4 à 5 Ko suivant les navigateurs.
De manière générale, on essaiera de garder les cookies simples.
Ne pas stocker d'informations sensibles
Les cookies ne sont pas un système sécurisé par défaut. L'utilisateur peut les consulter et les modifier depuis l'inspecteur de son navigateur.
Il ne faut donc pas stocker directement des informations sensibles dans un cookie. Par exemple, un cookie login avec la valeur 1 pour indiquer qu'un utilisateur est connecté serait dangereux, car il pourrait être modifié manuellement.
Pour les informations plus sensibles, PHP propose un autre mécanisme : les sessions, qui seront abordées dans le chapitre suivant.