Les cookies et leur programmation

Le nom de ce petit fichier qu'un site stocke sur l'ordinateur de chaque visiteur, pour y placer des données utilisable lors d'un retour ultérieur, vient de Magic Cookie qui sous Unix designe un paquet de données qui sont passées entre programmes différents.
On peut l'appeler simplement cookie ou cookie de navigateur, d'ordinateur, de suivi, d'Internet, du Web, ou cookie HTTP.

Son contenu est une liste de paires nom = valeur. Il n'est pas destiné à contenir du code exécutable sur le poste client, mais il peut servir à espionner l'utilisateur par une utilisation abusive des données enregistrées, notamment pour savoir quels sites qu'il visite.

L'origine des cookies remonte à 1994 et au navigateur Netscape (Mosaic Netscape 0.9 du 13/10/1994). Une spécification standard pour HTTP a été définie par l'IETF en 1997 (voir en références).

Anatomie d'un cookie

La taille maximale d'un cookie est de 4 ko. Leur nombre maximal dépend du navigateur, il est de 50 par domaine pour IE et Firefox. 300 au total sur un ordinateur.
Les noms sont insensibles à la casse.
La durée de vie peut être limitée à la session, à un nombre de jours donné ou ne pas être limitée. On peut configurer le navigateur pour supprimer les cookies en fin de session ou les refuser totalement.
Si une date est spécifiée, le cookie est effacé à cette date, sinon il est effacé en fin de session. Le navigateur peut repousser la date d'expiration à chaque visite du site.

Ils sont stockés dans plusieurs fichiers (IE), un seul fichier de texte (Firefox), un fichier crypté (Opera, Safari).

Les informations qui sont souvent placées dans un cookie:

Les cookies DART de Double Click et Adsense servent aux annonceurs à analyser l'utilisation des publicités. Quand on visite un site qui comporte des annonces de ces régies, ainsi que d'autres régies affiliées, la régie vérifie la présence du cookie et le crée s'il n'existe pas déjà.

L'utilisateur a un contrôle sur les cookies

Il est possible de configurer le navigateur pour interdire la création de cookies. Mais cela a des inconvénients, la plupart des services qui requièrent un enregistrement imposent la création d'un cookie qui peut servir à passer des données entre programmes. Pire encore, quand ils sont désactivés, la plupart des sites refusent l'enregistrement sans aucune explication.

L'option préférentielle est d'accepter les cookies pour la session seule. On peut aussi les interdire sauf pour les sites dont on donne la liste. Il faudra alors penser à créer une exception chaque fois que l'on voudra s'enregistrer aux services d'un nouveau site.

Sauf sur d'anciennes versions, les navigateurs ne lisent par défaut que les cookies concernant le site actuellement visité. On peut les configurer cependant pour accepter les cookies tiers. Cela est utilisé surtout par les sites d'annonces publicitaires.

Une des limitations pour le webmaster, est que si l'utilisateur utilise des navigateurs différents, chacun ayant son propre système de cookies est vu comme un utilisateur différent.

Quand aux cookies Dart de Double Click, vu le grand nombre de site utilisant ces régies, ces cookies auront tendance à réapparaître systématiquement. Double-Click propose un cookie de désactivation pour supprimer le suivi dans les autres cookies.

Cookies et sécurité

Même si les cookies ne contiennent que des données et si on interdit leur utilisation aux sites tiers (ce qui permettrait à un site pirate de récupérer des données d'authentification pour d'autres sites), ils sont source d'insécurité.

Piratage de réseau

Il est possible aux pirates de récupérer des cookies lors du transfert sur un réseau tel que le Wifi. L'utilisation du protocole https peut prévenir ce risque. Encore faut-il que ce protocole soit utilisé pour la création des cookies et non pas seulement pour d'autres communications.

Code malicieux

Il est aussi possible à du code intégré aux pages Web de récupérer les cookies de sites tiers même si le navigateur l'interdit.
Les pirates peuvent réutiliser le code JavaScript ou PHP d'un site pour récupérer des données sur les utilisateurs du site.

On peut le prévenir en interdisant le "cross-site scripting", la possibilité d'intégrer des scripts dans les URLs. Pour ce faire on ajoute un contrôle sur les paramètres dans les scripts. Par exemple:

$r = "^[\w]{1,40}$";
if (preg_match($r, $param) == 0) die("Hacking!");  

On vérifie ici qu'il n'y a que des caractères alpha-numériques dans le paramètre. Un article de Microsoft (en anglais) décrit en détail comment prévenir le cross-scripting.

Modification des données

L'utilisation d'un identifieur de session à la place des données, prévient les attaques par modification du cookie envoyé par le serveur.
Les données sont stockées sur le serveur et associé à l'ID de session qui est seul stocké sur le site de l'utilisateur.
Cette mesure convient aux sites craignant la manipulation des données, tels les sites marchands qui traitent automatiquement les commandes et les montants à verser.

Par dessous tout, la meilleure protection pour l'internaute est l'utilisation d'un navigateur récent. IE 6 notamment doit être remplacé.

Programmation des cookies

On crée un cookie par une requête d'en-tête HTTP. Les cookies sont créés par le navigateur, par un programme JavaScript ou un script sur le serveur, en PHP notamment.

Le cookie est une suite de nom=valeur séparés par un point virgule. Par exemple:

name=nomducookie; expires=date; domain=.scriptol.fr; path=/;

path est le chemin relatif sur le site de la page pour laquelle est créé le cookie.
expires indique la date d'expiration qui a le format: Lun, JJ-MMM-AAAA HH:MM:SS GMT.

Exemple de date d'expiration:

Mar 01-Jan-2009 12:40:10 GMT

Créer un cookie en PHP

setcookie("name1", "valeur1", time() + 1200);

On passe une ou plusieurs séries composées chacune d'un nom, une valeur optionnelle, un délai d'expiration et autres paramètres (voir manuel PHP).
Si la valeur est omise, le nom est supprimé de la liste sur l'ordinateur de l'utilisateur.

Afficher les cookies en PHP

Pour afficher tous les cookies:

print_r($_COOKIE);

Pour afficher le contenu du cookie dont le nom est x:

echo $_COOKIE["x"];

Créer un cookie en JavaScript

document.cookie = "nom" + "="  + escape("valeur") + ";";

On peut chainer des couples nom=valeur séparés par un point virgule et assigner la chaîne entière.

Afficher les cookies en JavaScript

document.write(document.cookie);

Démonstration de lecture de cookie en PHP et Javascript

En PHP:

Array ( [60gp] => R1864024671 )

Code source PHP:

<p>
<?php print_r($_COOKIE); ?>
</p>

En Javascript:

Code source JavaScript:

<p>
<script type="text/javascript">
if(document.cookie == null)
{
document.write("No cookie<br>");
}
var str = String(document.cookie);
document.write(str + "<br>");
</script>
</p>

Références: RFC 2109, spécification HTTP de 1997 définissant les cookies et RFC 2965, la spécification de 2000.