Les cookies et PHP

 

Les cookies et PHP

  1. Qu'est ce que c'est
  2. Créer un cookie avec PHP
  3. Lecture d'un cookie
  4. Détruire un cookie
  5. Infos complémentaires
  6. Liens connexes

Qu'est ce que c'est

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 :

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 :

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 /var/www/test.php:2) in /var/www/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 : http://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

Article écrit le / Mis à jour le par Bobe
[32] commentairesTop

Des commentaires ?

Auteur : Toto • 16/12/2002 @ 12:55 • #140

Même en faisant pareil que le tuto ça marche pas :( , je vais me mettre à l'ASP :p (je déonne)

Auteur : narfight • 25/12/2002 @ 14:50 • #152

vas sur [lien]

Auteur : Klem • 31/01/2003 @ 15:38 • #184

Vraiment terrible cette page :)
Merci !

Auteur : Adams • 06/04/2003 @ 23:24 • #272

Thank you!! Bravo!

Auteur : AXB • 02/06/2003 @ 19:55 • #343

J'arrive pas à enregistrer un cookie !!!
en plus ya 5 min ça marchait...

Auteur : chantecom • 07/08/2003 @ 10:08 • #389

Merci ça m'a beaucoup aidé ce Tuto mais je voudrais savoir comment faire pour supprimer un cookie avec un bouton

MERCI

Auteur : Bobe • 09/08/2003 @ 13:31 • #390

impossible, php est server-side.

pour supprimer un cookie, il faut refaire appel à la fonction setcookie() en spécifiant juste en premier argument le nom du cookie.

Auteur : chantecom • 17/08/2003 @ 10:40 • #398

comment se fait-il alors qu'un site que je connais y a réalisé

Auteur : Vador • 09/09/2003 @ 17:19 • #416

oui cela est très bien
bravo pour ce tuto
mais comment décoder un pass de cookies sa c''est vraiment intéressant

Auteur : elviz • 11/01/2004 @ 22:09 • #478

salut
je voudrais savoir comment on peut restaurer des sites a partir des cookies

Auteur : KahL • 28/01/2004 @ 13:15 • #493

Bonjour, et merci pour les explications .... ce sont les premieres que je comprends enfin ;)
Ma question est la suivante : comment faire qd on veut que la valeur entrée ds le cookie soit un texte saisi ds un formulaire ?
Merci

Auteur : Stephane • 10/04/2004 @ 12:41 • #538

Comment envoyer un cookie d'une durée de 10 ans?

Auteur : xion • 15/04/2004 @ 17:20 • #539

L'utilisation des cookies en javascript est-elle la même ? ou a-t-on accès à un autre système de cookie ? (le php est server-side, le javascript client permet donc de faire des cookies clients, cependant, sont-ils les même que ceux de php ?)

Auteur : scorpio07 • 21/05/2004 @ 13:39 • #564

Merci merci !

A chaque fois j'essayais mon cookies j'avais ce sublime message :

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

Fallait mettre le cokie en tout premier dans le code de la page (avant même le <html>). Et maintenant ça marche très bien !

Auteur : thrill • 28/01/2005 @ 17:21 • #651

es-ce possible de mettre plusieurs variables dans un cookie? si oui comment

Auteur : saxo • 18/09/2005 @ 10:42 • #720

Bonjour a tous,moi j'ai enlevé toute les balise html et j'ai toujour le fameux message

Auteur : webpsycho • 27/09/2005 @ 17:04 • #725

Salut saxo, vérifie si tu n'aurais pas laisser des espaces ou des enters avant ton <?php J'avais le même problème que toi et je l'ai réglé en enlevant les espaces. Je crois que php doit voir une espace devant lui comme du html...

Auteur : MickeyManu • 16/01/2006 @ 13:28 • #784

TRES bon tuto.
Merci aussi pour les tableaux dans les cookies j'en avais besoins :)

Pour ceux qui ont un pb de header déjà envoyé, attention aux sauts de ligne entre les balises:
?>
<?php
Envoie un retour chariot et donc le header ne peu plus être modifié. Aucun caractère avant le doctype.

Auteur : Maximelene • 18/01/2006 @ 17:01 • #786

Génial ça aussi ! Je vais pouvoir quitter les sessions pour me mettre aux cookies !

Euh... et si l'utilisateur refuse les cookies ?

Auteur : Samzamel • 09/04/2006 @ 03:24 • #866

Comment faire pour que le visiteur ne doive pas aller dans ses options pour accepter le cookie? Merci

Auteur : Vûk-Vük • 25/04/2006 @ 16:48 • #876

Merci pour ces éclaircissements! Sinon, comment repousser la date de destruction d'un cookie? Est-on obligé d'en créer un autre?

Auteur : boblamotte • 19/08/2006 @ 13:07 • #1623

j'ai eu le meme pb d'erreur.
Je l'ai résolu en créant un fichier spécial pour la fonction d'écriture du cookie et ensuite il FAUT IMPERATIVEMENT qu'il n'y ait pas d'espace ou autre caractère avant <?php et après ?>.
sinon cette page est tres claire...

Auteur : hleb • 10/09/2006 @ 13:08 • #2115

Bonjour,

Mon cookie se crée et la valeur s'affiche dans la page 1fois. Lorsque je rappelle la page, la valeur n'apparait plus.
Pourquoi ?
Merci de venir à mon aide , de m'expliquer un peu le pq du comment...

Auteur : Claude • 03/12/2006 @ 01:05 • #2594

Y a t'il un moyen de passer outre:

Warning: Cannot add header information

Il parraitrait que l'on peut ?

Auteur : Tetranon • 25/03/2007 @ 21:36 • #3637

Le message du 21/05/2004 montre que la plupart des gens ne savent pas lire... Espérons que depuis le temps, il ait appris. Quand au message du 18/01/2006, il suffit de cliquer sur le premier lien connexe pour avoir une réponse... Merci PHPCodeur pour cette page d'apprentissage et bon courage avec les millions de questions bêtes à venir d'internautes...

Auteur : vinz • 18/04/2007 @ 16:07 • #4152

tres bon tuto. et pour passer outre les 'cannot add header info' on peus utiliser ob_start() et ob_clean()

Auteur : Kevin • 24/04/2007 @ 08:26 • #4421

Voici quelques réponses aux multiples questions posées ici et sans réponse:

«comment faire pour supprimer un cookie avec un bouton»

Utilise un language client tel que javascript. ( [lien] ou [lien] )

«comment décoder un pass de cookies»

Il va faudra brute-forcer (md5 par exemple), si vous avez plusieurs vies devant vous, go for it !

«comment on peut restaurer des sites a partir des cookies»

Si j'ai bien compris cette question, comment rendre un site dynamique selon les cookies ? sinon, on ne peut pas "restaurer un site" avec des cookies.Pour le rendre dynamique, il faut ajouter des conditions:

ex:
<?php
if(empty($_COOKIE['ton_cookie'])){
//... operation 1
}else{
//... operation 2
?>

«comment faire qd on veut que la valeur entrée ds le cookie soit un texte saisi ds un formulaire ?»

<?php
$ton_champ = "";
if(!empty($_POST['ton_champ'])){ $ton_champ = $_POST['ton_champ']; }

setcookie('ton_cookie', $ton_champ);
?>

«Comment envoyer un cookie d'une durée de 10 ans?»

Il faut faire un calcul du nombre de secondes en 10 ans.

<?php
setcookie('ton_cookie', 'ta valeur', (time() + 10*365*24*60*60));
?>

«es-ce possible de mettre plusieurs variables dans un cookie? si oui comment»

Si le cookie est un tableau, tu devras quand même les ajouter un par un, ex: pour avoir la 8e donnée de ton cookie, tu devras écrire:

<?php
echo $_COOKIE['ton_cookie'][7];
?>

ou pour tout les afficher:

<?php

$i = 0;
while($i < count($_COOKIE['ton_cookie'])){
echo $_COOKIE['ton_cookie'][$i]."<br />";
$i++;
}

?>

«Comment faire pour que le visiteur ne doive pas aller dans ses options pour accepter le cookie?»

C'est impossible, il doit impérativement configurer son navigateur.

«Mon cookie se crée et la valeur s'affiche dans la page 1fois. Lorsque je rappelle la page, la valeur n'apparait plus. Pourquoi ?»

Ça serait préférable de voir le code source avant de répondre, mais as-tu vérifier la date d'expiration de ton cookie ?

«Y a t'il un moyen de passer outre: Warning: Cannot add header information»

Oui, avec un paramètre de apache, mais c'est inutile, ça rallenti le site et c'est beaucoup mieux de bien structurer son site au lieu de contourner les problèmes.

Ce tuto est très bien fait, merci.

Cordialement,
Kevin (kevin@kegisiteweb.com)

Auteur : Zabuza • 01/01/2008 @ 17:26 • #30853

Très bon Tuto, un qui essaie d'être dans le même style
[lien]
(pour enregistrer)
et pour lire :
[lien]

Auteur : mahdivitche • 06/05/2008 @ 02:31 • #53980

comment tester si un cookies existe ou non ???

et comment faire pour comparer la valeur d'un cookies avec un autre valeur ???

Auteur : Wolfen • 02/10/2008 @ 11:27 • #99307

Attention il me semble que beaucoup de personnes veulent accéder à un résultat sans se casser la tête.
Dans le cas des cookies il y a une 2 règles d'or à ne jamais oublier lorsqu'on veut les mettre en oeuvre:
1) L'instruction setcookie() doit-être positionner avant toute autre commande de sortie vers le navigateur(echo, printf, ...).
2) La valeur du cookie ne pourra être testée/récupérée qu'aprés l'envoie d'une nouvelle page dans le navigateur(Une autre page ou recharger la page courante)
Ceci dit beaucoup de problèmes sont inhérents à la structure même du programme.
Réflechissez bien en ayant toujours en tête c'est 2 règles, je le répéte la plupart des probleme sur les cookies sont du a un programme mal structuré, croyez-moi j'en suis passé par là.

Bon courage

Allez une petite astuce de rien du tout:
Rien ne vous empêche de forcer la valeur de la variable du cookie $_COOKIE['votre cookie'] au moment de la création/moidification du cookie de manière à avoir la bonne valeur sans avoir à recharger la page.
setcookie("moncookie","bonnevaleur")
$_COOKIE["moncookie"]="bonnevaleur"
ainsi on peut continuer le traitement avec la valeur mise à jour du cookie

Auteur : mushroom • 10/02/2009 @ 17:33 • #109059

Kevin, si je peux me permettre, utilise foreach et non un while pour les arrays, c'est plus propre :-)

foreach($_COOKIE['ton_cookie'] as $key => $value)
{
echo 'cookie '. $key .' : '. $value .'<br />';
}

ainsi si $_COOKIE est une matrice tu peux accéder simplement au prochain niveau:
$value['enregistrement']

Sinon pour le problème des headers, c'est votre code qui est mal conçus. Je vous conseil de jeter un coup d'oeuil sur le design pattern "MVC".

Personnellement j'ai un objet qui s'occupe de mes affichages, je charge donc tout dans l'objet au lieu d'afficher directement avec un echo, et c'est uniquement sur __destruct qui j'affiche à l'écran. Ainsi je fais ce que je veux ou je veux sans jamais de soucis ni rien forcer du tout, au pire j'aurais chargé un peu d'html dans mon objet pour rien...

pour contribuer également un peu au questions:

Pour savoir si un cookie existe: if(isset($_COOKIE['ton_cookie'])) echo 'cookie existant';
else 'cookie n\'existe pas';

pour comparer des valeures:
if($_COOKIE['ton_cookie'] == 'string') echo 'valeure identique';
else echo 'valeure non identique';

utiliser === si c'est une booléene ou is_null pour une valeure null. Ne pas mettre de '' si c'est un int.

En gros les cookies sont des variables comme les autres. Si vous avez de la peine à comprendre, jeter un coup d'oeuil sur les array(). $_COOKIE n'est rien d'autre qu'un array system, tout comme $_GET, $_POST ou encore $_SESSION.

dernière choses: les cookies créés par php ou javaScript sont les mêmes, et sont toujours chez le client.

Sinon pour les md5, attention aux rainbow tables! Je vous conseille 2-3 petites astuces qui rendent l'utilisation des rainbows tables impossible:

on crypte plusieurs fois! ainsi les enregistrements ne seront dans aucune table, ont ajoute des salts, et ont le coupe à 31 caractères au lieu de 32: La vous êtes sûre qu'il est impossible que votre chaine retour soit dans une rainbow table :-p

function crypt($password)
{
global $_salts;
$token = substr(md5(sha1(md5(base64_encode($password).$_salts[0]).$_salts[1]).$_salts[2]), 0, 31);
return $token;
}

Auteur : wam • 05/03/2009 @ 00:06 • #110725

Tuto très clair, bravo !

Pour ce qui est du commentaire de mushroom sur la fonction crypt, je suis un peu réticent : cette méthode est extrêmement lourde (et donc très longue) alors qu'un simple hash (md5 ou mieux, sha-1) avec un salt réduit énormément les risques d'attaques par rainbow tables.

Déposer un commentaire

Pseudo, Email et Options

Tapez votre commentaire

Note : Vos données personnelles restent strictement confidentielles et ne sont pas réutilisées à votre insu. Vous pouvez consulter à ce propos cette page.

Valid HTML Valid CSS Mozilla et Firebird