HomeDevLes Cookies et PHP

Les Cookies et PHP

Déjà, c’est quoi les cookies ?

Non, les cookies dont je vais vous parler ici n’ont rien à voir avec le gâteau du même nom.

Les cookies sont de petits fichiers texte présents sur l’ordinateur client et envoyés par le serveur. La grande utilité des cookies est de pouvoir y stocker diverses informations que vous pouvez récupérer ultérieurement (nous verrons comment plus loin dans cet article). Le désavantage des cookies est que le client (comprenez le visiteur) peut paramétrer son navigateur pour refuser les cookies.

Il est donc élémentaire de ne pas s’appuyer excusivement sur l’utilisation des cookies et de prévoir un système de secours (passage des variables par l’URL par exemple).

Voila en gros à quoi ressemble le contenu d’un cookie :

Contenu d'un cookie

Commençons par le nom du fichier : bobe@www.phpcodeur[2].txt

Remarquez le chiffre entre crochets, il indique le nombre de cookies contenus dans le fichier. En effet, tous les cookies émis par un même site sont stockés dans le même fichier. Le contenu du fichier consiste en une suite de données, séparées par un saut de ligne [1], les différents cookies étant séparés entre eux par un astérisque.

Voici comment se compose le premier cookie :

  • pseudo correspond au nom que j’ai donné au cookie
  • bobe correspond à la valeur du cookie
  • www.phpcodeur.net/ correspond au répertoire pour lequel le cookie est actif (ici, le répertoire racine du site et tous les sous répertoire, en résumé, le cookie est actif sur tout le site)

Vient ensuite une série de chiffre dont je n’ai pas dicerné précisément l’utilité puis l’astérisque de séparation.
Et maintenant, le deuxième cookie :

  • pass, le nom du cookie
  • dfg84regj87uk9zef78uk4vv4zry8HFD, la valeur du cookie (ici, un mot de passe crypté [2])
  • www.phpcodeur.net/ toujours pour le répertoire à partir duquel le cookie est actif

Pour la gestion des cookies, le langage PHP met à disposition la fonction setcookie(). En voici la définition :

int setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

PHP enverra le cookie name avec la valeur value au navigateur client. La date d’expiration expire du cookie doit être un timestamp unix, et si elle n’est pas précisée, le cookie est supprimé à la fin de la session [3]. Le répertoire path indique les répertoires du site émetteur où le cookie est actif. domain indique le nom de domaine émetteur. Enfin, secure permet d’indiquer si le cookie doit être envoyé uniquement à travers une connexion sécurisée.

<?php
setcookie('cookie_name', 'blablabla', (time() + 3600));
?>

Ici, on envoie un cookie portant le nom cookie_name et ayant la valeur blablabla. Sa durée de vie est de une heure (timestamp unix + 3600 secondes)

Note : La valeur du cookie est automatiquement encodé lors de l’envoi et décodé lors de la réception.

Note : Les cookies doivent être envoyés avant tout début d’affichage, c’est à dire qu’aucune donnée ne doit avoir été envoyé en sortie lors de l’appel à la fonction setcookie(), sinon, vous aurez droit à un message d’erreur de ce genre :

Warning: Cannot add header information – headers already sent by (output started at f:\web\www\test\test.php:2) in f:\web\www\test\test.php on line 4

Pour réceptionner le contenu du cookie, rien de plus simple, la valeur du cookie est affectée à une variable portant le nom du cookie. Toutefois, cela n’est pas très pratique pour s’y retrouver plus tard dans son code, et c’est pas top niveau sécurité, car vous n’êtes pas sûr que le contenu de la variable portant le nom du cookie vienne bien du cookie.

Préférez donc la variable prédéfinie $_COOKIE ou encore $HTTP_COOKIE_VARS (si vous travaillez sur PHP 4.1.0 ou supérieur).
Si l’on reprend l’exemple précédent :

<?php
  /*
   * Les trois exemples suivants afficheront
   * tous "blablabla".
   */
  echo $cookie_name; // exemple 1 (si registar_globals est à on dans php.ini)
  echo $HTTP_COOKIE_VARS['cookie_name']; // exemple 2
  echo $_COOKIE['cookie_name']; // exemple 3 (si on est sur PHP 4.1.0 ou plus)

?>

Note : Vous ne pouvez pas lire le contenu d’un cookie aussitôt après l’avoir envoyé, vous devez attendre d’avoir changé de page ou d’avoir rechargé la page.

Pour cela, il vous suffit de faire appel à la fonction setcookie() avec pour seul argument le nom du cookie à détruire. Vous pouvez également spécifier une chaine quelconque pour la valeur du cookie et une valeur minimale pour la date d’expiration du cookie.
Toujours avec le même exemple de cet article :

<?php
  /*
   * Les deux exemples suivants sont équivalents
   */
  setcookie('cookie_name'); // exemple 1
  setcookie('cookie_name', '', 1); // exemple 2
?>

Informations complémentaires

Si vous voulez que le cookie ne soit accessible que pour certains répertoires de votre site, vous pouvez le spécifier avec le quatrième argument de la fonction setcookie().
Admettons que vous ayez un répertoire rep1 sur votre site : https://www.domaine.com/rep1/

<?php
  setcookie('cookie_name', 'blablabla', (time() + 3600), '/rep1/');
?>

Le cookie ne pourra être lu que par un script se trouvant dans le répertoire rep1 ou dans un de ses sous-repertoires.

Vous pouvez également utiliser les cookies comme des tableaux :

<?php
  setcookie('cookie_name[miam]', 'c\'est bon', (time() + 3600));
  setcookie('cookie_name[slurp]', 'c\'est délicieux', (time() + 3600));
  setcookie('cookie_name[berk]', 'c\'est dégueulasse', (time() + 3600));
?>

Et pour réceptionner les cookies :

<?php
  echo $_COOKIE['cookie_name']['miam']; // affichera "c'est bon"
  echo $_COOKIE['cookie_name']['slurp']; // affichera "c'est délicieux"
  echo $_COOKIE['cookie_name']['berk']; // affichera "c'est dégueulasse"
?>

Liens connexes sur les cookies

  • [1] : Le bloc-notes de Windows, honni soit-il, visualise les sauts de ligne Unix sous forme de carrés noirs
  • [2] : Le mot de passe est ici fictif, bien entendu…
  • [3] : C’est à dire lorsque la fenêtre du navigateur est fermée

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

PHP Codeur