Les cookies



Travailler avec des cookies revient à peu près à la même chose qu'avec des sessions, à quelques petites différences près que nous allons voir. Voici ce que nous allons faire pour découvrir les cookies :

  1. on va voir ce qu'est exactement un cookie (parce que si ça se trouve, il y en a qui croient en ce moment même que je vais parler de recettes de cuisine !);
  2. ensuite, nous verrons comment écrire un cookie : c'est facile à faire, si on respecte quelques règles ;
  3. enfin, nous verrons comment récupérer le contenu d'un cookie : ce sera le plus simple.

Qu'est-ce qu'un cookie ?



Un cookie, c'est un petit fichier que l'on enregistre sur l'ordinateur du visiteur.
Ce fichier contient du texte et permet de « retenir » des informations sur le visiteur. Par exemple, vous inscrivez dans un cookie le pseudo du visiteur, comme ça la prochaine fois qu'il viendra sur votre site, vous pourrez lire son pseudo en allant regarder ce que son cookie contient.

Parfois les cookies ont une mauvaise image. On fait souvent l'erreur de penser que les cookies sont « dangereux ». Non, ce ne sont pas des virus, juste de petits fichiers texte qui permettent de retenir des informations. Au pire, un site marchand peut retenir que vous aimez les appareils photos numériques et vous afficher uniquement des pubs pour des appareils photos, mais c'est tout, ces petites bêtes sont inoffensives pour votre ordinateur.

Chaque cookie stocke généralement une information à la fois. Si vous voulez stocker le pseudonyme du visiteur et sa date de naissance, il est donc recommandé de créer deux cookies.

Où sont stockés les cookies sur mon disque dur ?



Cela dépend de votre navigateur web. Généralement on ne touche pas directement à ces fichiers, mais on peut afficher à l'intérieur du navigateur la liste des cookies qui sont stockés. On peut choisir de les supprimer à tout moment.

Si vous avez Mozilla Firefox, vous pouvez aller dans le menu Outils / Options / Vie privée et cliquer sur Supprimer des cookies spécifiques. Vous obtenez la liste et la valeur de tous les cookies stockés, comme sur la figure suivante.

Cookies sous Firefox



Les cookies sont classés par site web. Chaque site web peut écrire, comme vous le voyez, plusieurs cookies. Chacun d'eux a un nom et une valeur (que vous pouvez voir à la ligne Contenu sur la figure suivante). Vous noterez que comme tout cookie qui se respecte, chacun a une date d'expiration. Après cette date, ils ne sont plus bons à manger ils sont automatiquement supprimés par le navigateur.

Les cookies sont donc des informations temporaires que l'on stocke sur l'ordinateur des visiteurs. La taille est limitée à quelques kilo-octets : vous ne pouvez pas stocker beaucoup d'informations à la fois, mais c'est en général suffisant.


Écrire un cookie



Comme une variable, un cookie a un nom et une valeur. Par exemple, le cookie pseudo aurait chez moi la valeur M@teo21.

Pour écrire un cookie, on utilise la fonction PHP setcookie (qui signifie « Placer un cookie » en anglais).
On lui donne en général trois paramètres, dans l'ordre suivant :

  1. le nom du cookie (ex. : pseudo) ;
  2. la valeur du cookie (ex. : M@teo21) ;
  3. la date d'expiration du cookie, sous forme de timestamp (ex. : 1090521508).

Le paramètre correspondant à la date d'expiration du cookie mérite quelques explications. Il s'agit d'un timestamp, c'est-à-dire du nombre de secondes écoulées depuis le 1er janvier 1970. Le timestamp est une valeur qui augmente de 1 toutes les secondes. Pour obtenir le timestamp actuel, on fait appel à la fonction time(). Pour définir une date d'expiration du cookie, il faut ajouter au « moment actuel » le nombre de secondes au bout duquel il doit expirer.

Si vous voulez supprimer le cookie dans un an, il vous faudra donc écrire : time() + 365*24*3600. Cela veut dire : timestamp actuel $+$ nombre de secondes dans une année. Cela aura pour effet de supprimer votre cookie dans exactement un an.

Voici donc comment on peut créer un cookie :

Code : PHP 

1

<?php setcookie('pseudo', 'M@teo21', time() + 365*24*3600); ?>


Sécuriser son cookie avec le mode httpOnly



Je recommande toutefois d'activer l'option httpOnly sur le cookie. Sans rentrer dans les détails, cela rendra votre cookie inaccessible en JavaScript sur tous les navigateurs qui supportent cette option (c'est le cas de tous les navigateurs récents.). Cette option permet de réduire drastiquement les risques de faille XSS sur votre site, au cas où vous auriez oublié d'utiliser htmlspecialchars à un moment.

Je vous recommande donc de créer votre cookie plutôt comme ceci :

Code : PHP 

1

<?php setcookie('pseudo', 'M@teo21', time() + 365*24*3600, null, null, false, true); ?>



Le dernier paramètre true permet d'activer le mode httpOnly sur le cookie, et donc de le rendre en quelque sorte plus sécurisé. Ça ne coûte rien et vous diminuez le risque qu'un jour l'un de vos visiteurs puisse se faire voler le contenu d'un cookie à cause d'une faille XSS.

Les paramètres du milieu sont des paramètres que nous n'utilisons pas, je leur ai donc envoyé null.


Créer le cookie avant d'écrire du HTML



Il y a un petit problème avec setcookie… Comme pour session_start, cette fonction ne marche QUE si vous l'appelez avant tout code HTML (donc avant la balise <!DOCTYPE>).

Ne placez donc JAMAIS le moindre code HTML avant d'utiliser setcookie. La plupart des gens qui ont des problèmes avec setcookie ont fait cette erreur, donc souvenez-vous en !



Voyons maintenant comment je ferais pour écrire deux cookies, un qui retient mon pseudo pendant un an, et un autre qui retient le nom de mon pays :

Code : PHP

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

12

13

14

15

16

<?php

setcookie('pseudo', 'M@teo21', time() + 365*24*3600, null, null, false, true); // On écrit un cookie

setcookie('pays', 'France', time() + 365*24*3600, null, null, false, true); // On écrit un autre cookie...

// Et SEULEMENT MAINTENANT, on peut commencer à écrire du code html

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >

   <head>

       <title>Ma super page PHP</title>

        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

    </head>

    <body>

     etc.



Et voilà, les cookies sont écrits ! Comme vous le voyez, pour écrire deux cookies il faut appeler deux fois setcookie.


Afficher un cookie



C'est la partie la plus simple. Avant de commencer à travailler sur une page, PHP lit les cookies du client pour récupérer toutes les informations qu'ils contiennent. Ces informations sont placées dans la superglobale $_COOKIE, sous forme d'array, comme d'habitude.

De ce fait, si je veux ressortir le pseudo du visiteur que j'avais inscrit dans un cookie, il suffit d'écrire : $_COOKIE['pseudo'].

Ce qui nous donne un code PHP tout bête pour afficher de nouveau le pseudo du visiteur :

Code : PHP 

1

2

3

4

5

<p>

    Hé ! Je me souviens de toi !<br />

    Tu t'appelles <?php echo $_COOKIE['pseudo']; ?> et tu viens de <?php echo $_COOKIE['pays']; ?> c'est bien ça ?

</p>



Comme vous le voyez encore une fois, le gros avantage c'est que les superglobales sont accessibles partout.
Vous avez besoin de savoir ce que contient le cookie pseudo ? Affichez donc le contenu de la superglobale $_COOKIE['pseudo'] ! 

À noter que si le cookie n'existe pas, la variable superglobale n'existe pas. Il faut donc faire un isset pour vérifier si le cookie existe ou non.

Les cookies viennent du visiteur. Comme toute information qui vient du visiteur, elle n'est pas sûre. N'importe quel visiteur peut créer des cookies et envoyer ainsi de fausses informations à votre site. Souvenez-vous en lorsque vous lisez les cookies du visiteur : il peut les avoir modifiés, donc soyez prudents et n'ayez pas une confiance aveugle en leur contenu !




Modifier un cookie existant



Vous vous demandez peut-être comment modifier un cookie déjà existant ? Là encore, c'est très simple : il faut refaire appel à setcookie en gardant le même nom de cookie, ce qui « écrasera » l'ancien.

Par exemple, si j'habite maintenant en Chine, je ferai :

Code : PHP 

1

setcookie('pays', 'Chine', time() + 365*24*3600, null, null, false, true);



Notez qu'alors le temps d'expiration du cookie est remis à zéro pour un an.

Créé avec HelpNDoc Personal Edition: Maximisez votre portée : convertissez votre document Word en eBook ePub ou Kindle