Présentation des cookies
Un cookie est un petit fichier texte qui ne peut contenir qu’une quantité limitée de données.
Les cookies vont être stockés sur les ordinateurs de vos visiteurs. Ainsi, à tout moment, un utilisateur peut lui même supprimer les cookies de son ordinateur.
De plus, les cookies vont toujours avoir une durée de vie limitée. On pourra définir la date d’expiration d’un cookie.
Généralement, nous allons utiliser les cookies pour faciliter la vie des utilisateurs en préenregistrant des données les concernant comme un nom d’utilisateur par exemple.
Ainsi, dès qu’un utilisateur connu demande à accéder à une page de notre site, les cookies vont également automatiquement être envoyées dans la requête de l’utilisateur. Cela va nous permettre de l’identifier et de lui proposer une page personnalisée.
Les cookies ne sont donc pas dangereux en soi même s’ils continuent d’avoir mauvaise réputation. En revanche, on évitera toujours de stocker des informations sensibles dans les cookies comme des mots de passe par exemple car les cookies sont stockés sur l’ordinateur des visiteurs et nous n’avons donc aucune maitrise ni aucun moyen de les sécuriser après le stockage.
Créer un cookie en PHP
Pour créer un cookie en PHP, nous allons utiliser la fonction setcookie()
.
Une particularité notable de cette fonction est qu’il va falloir l’appeler avant d’écrire tout code HTML pour qu’elle fonctionne puisque les cookies doivent être envoyés avant toute autre sortie. Pour information, cette restriction provient du protocole HTTP et non pas de PHP.
Cette fonction peut accepter jusqu’à sept valeurs en arguments. Cependant, seul la première (le nom du cookie créé) est obligatoire.
La syntaxe de base de setcookie()
est la suivante < code>setcookie(name, value, expire, path, domain, secure, httponly). Les paramètres ont la signification suivante :
Paramètre | Signification |
---|---|
name | Le nom du cookie. Le nom d’un cookie est soumis aux mêmes règles que les noms des variables. |
value | La valeur du cookie. Comme cette valeur est stockée sur l’ordinateur d’un utilisateur, on évitera de stocker des informations sensibles. |
expires | La date d’expiration du cookie sous forme d’un timestamp UNIX (nombre de secondes écoulées depuis le 1er janvier 1970). Si aucune valeur n’est passée en argument, le cookie expirera à la fin de la session (lorsque le navigateur sera fermé). |
path | Le chemin sur le serveur sur lequel le cookie sera disponible. Si la valeur est ‘/’, le cookie sera disponible sur l’ensemble du domaine. Si la valeur est ‘/cours/’, le cookie ne sera disponible que dans le répertoire (le dossier) /cours/ (et dans tous les sous-répertoires qu’il contient). |
domain | Indique le domaine ou le sous domaine pour lequel le cookie est disponible. |
secure | Indique si le cookie doit uniquement être transmis à travers une connexion sécurisée HTTPS depuis le client. Si la valeur passée est true , le cookie ne sera envoyé que si la connexion est sécurisée. |
httponly | Indique si le cookie ne doit être accessible que par le protocole HTTP. Pour que le cookie ne soit accessible que par le protocole http, on indiquera la valeur true . Cela permet d’interdire l’accès au cookie aux langages de scripts comme le JavaScript par exemple, pour se protéger potentiellement d’une attaque de type XSS. |
Créons immédiatement deux premiers cookies pour bien comprendre comment fonctionne setcookie()
.
<?php setcookie('user_id', '1234'); setcookie('user_pref', 'dark_theme', time()+3600*24, '/', '', true, true); ?> <!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php ?> <p>Un paragraphe</p> </body> </html>
Ici, on crée deux cookies avec setcookie()
: un premier cookie nommé user_id
qui stockera l’ID d’un visiteur pour la session actuelle par exemple ce qui nous permettra de l’identifier pendant sa navigation sur notre site et un deuxième cookie qu’on appelle user_pref
qui stockera les préférences mentionnés par l’utilisateur pour notre site (utilisation d’un thème sombre par exemple).
Bien évidemment, dans le cas présent, il faut imaginer qu’on possède un système nous permettant de créer des ID de session et que notre site propose aux utilisateurs de choisir une apparence personnalisée pour celui-ci car ce n’est pas l’objet de la leçon.
Comme je vous l’ai précisé précédemment, il faut appeler cette fonction avant d’écrire un quelconque code HTML. Nous appelons donc setcookie()
dans une balise PHP, avant même d’écrire notre élément html
.
Pour notre premier cookie user_id
, nous ne précisons qu’un nom et une valeur et laissons le PHP utiliser les valeurs par défaut pour les autres arguments de setcookie()
.
Nous utilisons ensuite la fonction time()
sans lui passer d’argument pour récupérer la valeur du timestamp actuel. Nous allons nous servir de cette valeur en lui ajoutant un certain nombre de secondes pour définir la date d’expiration de notre deuxième cookie user_pref
. Dans le cas présent, on définit une durée de vie de 24h pour le cookie (3600 secondes * 24 à partir de sa date de création).
Toujours pour notre deuxième cookie, nous utilisons la valeur par défaut pour le chemin du serveur sur lequel le serveur est accessible, c’est à dire la valeur /
qui signifie que le cookie sera accessible sur l’ensemble d’un domaine ou d’un sous-domaine (c’est-à-dire dans tous ses répertoires).
On ne précise pas de domaine de validité ici car nous travaillons en local. Si j’avais voulu rendre mon cookie disponible pour tout mon site, j’aurais précisé pierre-giraud.com
.
Finalement, nous précisons les valeurs true
pour les arguments « secure » (passage par une connexion sécurisée pour transmettre le cookie) et « httponly » (obligation d’utiliser le protocole HTTP pour accéder au cookie).
Récupérer la valeur d’un cookie
Pour récupérer la valeur d’un cookie, nous allons utiliser la variable superglobale $_COOKIE
.
Cette superglobale est un tableau associatif qui utilise les noms des cookies en clefs et associe leurs valeurs en valeurs du tableau.
On va donc pouvoir accéder à la valeur d’un cookie en particulier en renseignant le nom du cookie en clef de ce tableau.
<?php setcookie('user_id', '1234'); setcookie('user_pref', 'dark_theme', time()+3600*24, '/', '', true, true); ?> <!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php if(isset($_COOKIE['user_id'])){ echo 'Votre ID de session est le ' .$_COOKIE['user_id']; } ?> <p>Un paragraphe</p> </body> </html>
Ici, on commence par vérifier qu’un cookie user_id
existe et a bien été défini et stocké dans $_COOKIE
avec la fonction isset()
. Si c’est le cas, on echo
la valeur du cookie.
Ici, il faut bien noter que la variable $_COOKIE
stocke la liste des cookies renvoyés par le navigateur. Lorsqu’un utilisateur demande à accéder à notre page pour la première fois, le cookie user_id
est créé côté serveur et est renvoyé au navigateur afin qu’il soit stocké sur la machine du visiteur.
Ainsi, la première fois qu’un utilisateur demande notre page, la variable $_COOKIE
ne stocke pas encore notre cookie puisque celui-ci n’a pas encore été créé et donc le navigateur du visiteur ne peut rien renvoyer. Le test de notre condition if
échoue donc lors du premier affichage de la page.
Si on actualise ensuite la page, en revanche, le navigateur renvoie bien cette fois-ci la valeur de notre cookie et son nom et celui-ci est bien stocké dans $_COOKIE
. Le test de notre condition va alors être vérifié et on va pouvoir echo
la valeur de ce cookie.
Modifier la valeur d’un cookie ou supprimer un cookie
Pour modifier la valeur d’un cookie, nous allons appeler à nouveau la fonction setcookie()
en lui passant le nom du cookie dont on souhaite changer la valeur et changer l’argument de type valeur passé à la fonction avec la nouvelle valeur souhaitée.
Pour supprimer un cookie, nous allons encore appeler setcookie()
en lui passant le nom du cookie qu’on souhaite supprimer et allons cette fois-ci définir une date d’expiration se situant dans le passé pour le cookie en question.
<?php //On définit deux cookies setcookie('user_id', '1234'); setcookie('user_pref', 'dark_theme', time()+3600*24, '/', '', false, false); //On modifie la valeur du cookie user_id setcookie('user_id', '5678'); //On supprime le cookie user_pref setcookie('user_pref', '', time()-3600, '/', '', false, false); ?> <!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php if(isset($_COOKIE['user_id'])){ echo 'Votre ID de session est le ' .$_COOKIE['user_id']. '<br>'; } if(isset($_COOKIE['user_pref'])){ echo 'Votre thème préféré est ' .$_COOKIE['user_pref']; }else{ echo 'Pas de thème préféré défini'; } ?> <p>Un paragraphe</p> </body> </html>
Ici, on commence par définir deux cookies user_id
et user_pref
. On modifie ensuite la valeur de notre cookie user_id
et on passe une date d’expiration passée à notre cookie user_pref
pour le supprimer.
Bien évidemment, encore une fois, cela n’a pas l’air très intéressant dans le cas présent car nous définissons nous-mêmes nos cookies, leurs valeurs et leurs durées de vie manuellement.
Cependant, vous devez à chaque fois imaginer que toutes ces notions vont être utiles dans un contexte dynamique où il faudra changer la valeur d’un cookie en fonction du changement de préférence d’un utilisateur par exemple.
Bonjour juste pour préciser que je n’arrive pas à accéder au chapitre précédent concernant les variables super globales. Elle est en page introuvable.
Bonjour,
Merci c’est corrigé !
Bonjour Pierre,
Je n’arrive pas à créer de cookie, même en recopiant dans un fichier test le script du site.
Cordialement
Philippe
Bonjour,
Désolé pour le retard dans la réponse, je suis en plein déménagement !
Cela vient probablement de la configuration de MAMP / WAMP. Si vous travaillez avec MAMP, vous devriez chercher la variable « output_buffering » dans le fichier php.ini relatif à la version de mamp utilisée et modifier la valeur si celle-ci est sur « off » (vous pouvez mettre 4096 à la place par exemple).
Cordialement,
Bonjour Pierre,
Cela pourrait-il venir de mon PC, navigateur ou FAI?
Cordialement
Philippe