Les cookies

  • « workaround », astuce : pour contourner l’aspect non connecté de HTTP
  • Informations données par le serveur web au navigateur, qui les stocke et les renvoie au serveur web à chaque connexion
  • Peuvent être associées à un domaine et à un chemin d’accès
  • Se situent dans la mémoire vive ou dans un fichier texte (si une durée de vie est associée à la cookie)
  • Peuvent contenir des informations textuelles

Fonctions PHP

  • Création et envoi d’un cookie :
    • Fonctions :
      • setcookie(<nom>,<valeur>)‏
      • setcookie(<nom>,<valeur>,<dateExpiration>)‏
  • Lecture d’un cookie :
    • Variable :
      • $_COOKIE[<nom>]
  • Suppression d’un cookie :
    • Fonction :
      • setcookie(<nom>)‏

création

<?php

$date = date("d-m-Y");
$heure = date("H:i");
$valeurCookie = 'Dernière visite ' . $date . ' ' . $heure;

setcookie('dateVisite', $valeurCookie, mktime(0,0,0,12,31,2037));

echo <<< FIN

<html>
<head><title>Visite</title></head>
<body>
<p> un cookie a été envoyé </p>
<p> son nom est dateVisite </p>
<p> son contenu est $valeurCookie </p>
</body>
</html>

FIN

lecture

<?php

if ( isset($_COOKIE['dateVisite'] )  ){

	echo "<p>Un cookie existe</p>";
	echo "<p>Son contenu est : " . $_COOKIE['dateVisite']. " </p>";
	
} else { 
	echo "<p>Pas de cookie</p>";

}

Données complexes

  • Permettent d’enregistrer une valeur textuelle

  • Comment enregistrer une valeur plus complexe (par ex, un tableau) ?

  • Il faut transformer les données en texte, par la « sérialisation ».

  • Fonctions :
    • serialize()‏
    • unserialize()
    • json_encode()
    • json_decode()
<?php

if (isset ( $_COOKIE['listeVisite'] ) ) {
	$listeSerialisee = $_COOKIE['listeVisite'];
	$listeTableau = unserialize($listeSerialisee);
} else {
	$listeTableau = array();
}

$date = date("d-m-Y");
$heure = date("H:i");
$valeurCookie = 'Dernière visite ' . $date . ' ' . $heure;

$listeTableau[] = $valeurCookie;

$listeSerialisee = serialize($listeTableau);

setcookie('listeVisite', $listeSerialisee, mktime(0,0,0,12,31,2037));

echo <<< FIN

<html>
<head><title>Visite</title></head>
<body>
<p> un cookie a été envoyée sous forme de liste </p>
<p> son nom est listeVisite </p>
<p> son contenu a été enrichi $valeurCookie </p>
</body>
</html>

FIN
<?php

if ( isset($_COOKIE['listeVisite'] )  ){

	$listeSerialisee = $_COOKIE['listeVisite'];
	$listeTableau = unserialize($listeSerialisee);
	echo "Liste des visites <br />";
	foreach ($listeTableau as $visite) {
		echo $visite . "<br />";
	}
	
} else { 
	echo "<p>Pas de cookie</p>";

}

La sécurité des cookies

  • Il est possible de restreindre la portée d’un cookie, en spécifiant :
    • un chemin d’accès
    • et/ou un nom de domaine
  • Le navigateur n’enverra alors le cookie que pour le domaine indiqué et/ou le chemin d’accès
    • Fonctions :
      • setcookie(<nom>, <valeur>, <date>, <chemin>, <domaine>)‏
<?php

setcookie('nomCookie', 'valeurCookie', mktime(0,0,0,12,31,2037), '/', '.formatux.be');
setcookie('nomCookie', 'valeurCookie', '/evaluation', 'www.formatux.be');
// warning, mais OK
setcookie('nomCookie', 'valeurCookie', '/help');
// warning, mais OK
setcookie('nomCookie', 'valeurCookie', mktime(0,0,0,12,31,2037), '/help');
  • Les cookies n’ont aucune sécurité :
    • Ils sont lisibles par le client
    • Ils sont modifiables par le client
    • Ils sont lisibles par d’autres applications
    • Ils ne sont pas cryptés
    • Ils sont limités, en général, à quelques Ko (4) et à par domaine (20 cookies)‏
    • Ils ne peuvent donc contenir aucune donnée sensible !!!

Exercice

  • Annotations
    # Ecrivez un script qui permette d'implémenter un compteur de visites en PHP, et qui en donne l'affichage.
    
  • PHP
    <?php
    
    if ( ! isset($_COOKIE['compteurVisite'] )  ){
    
        $visites = 1;
    
    } else {
        $visites = $_COOKIE['compteurVisite'] + 1;
    
    }
    
    setcookie('compteurVisite', $visites, mktime(0,0,0,12,31,2037));
    
    ?>
    
    <html>
    <head><title>Visite</title></head>
    <body>
    <p> Compteur : <?php echo $visites ?> </p>
    </body>
    </html>
    
  • Annotations
    # Ecrivez un petit programme PHP qui affiche à l'utilisateur un nombre aléatoire entre 1 et 6...
    # Mais, au sein de cette page, l'utilisateur doit pouvoir spécifier sa couleur préférée de fond de page dans une liste qui en compte 5 (rouge, jaune, vert, bleu, blanc).
    # Lorsqu'il se connecte sur cette page, il reçoit alors la page dans sa couleur préférée.
    # Attention : pour modifier sa couleur, l'utilisateur doit utiliser une liste déroulante, dans laquelle sa couleur préférée sera toujours pré-sélectionnée.
    
  • PHP
    <?php
    
    $listeCouleurs = [
    
        "red" => "Rouge",
        "green" => "Vert",
        "yellow" => "Jaune",
        "white" => "Blanc",
        "blue" => "Bleu"
    ];
    
    if (isset ($_COOKIE['couleurPreferee'])) {
        $couleur = $_COOKIE['couleurPreferee'];
    } else $couleur = "white";
    
    if (isset ($_REQUEST['couleurChoisie'])) {
        $couleur = $_REQUEST['couleurChoisie'];
        setcookie('couleurPreferee', $couleur, mktime(0, 0, 0, 12, 31, 2037));
    }
    
    $nombre = mt_rand(1, 6);
    
    ?>
    
    
    <html>
    <head><title>Visite</title></head>
    <body bgcolor="<?php echo $couleur ?>">
    <p> NOMBRE ALEATOIRE : <?php echo $nombre ?> </p>
    <br/>
    <br/>
    
    <form method="post" action="exercice_couleurPreferee.php" enctype="multipart/form-data">
        <legend><b>Sélectionnez votre couleur préférée : </b></legend>
        <select name="couleurChoisie">
            <?php foreach($listeCouleurs as $code => $value): ?>
                <option
                    value="<?php echo $code ?>" <?php echo($code == $couleur ? "SELECTED" : "") ?> > <?php echo $value ?> </option>
                <?php endforeach; ?>
        </select>
        <br/>
        <input type="submit" value="Soumettre"/>
    </form>
    </body>
    </html>
    

Table des Matières

Sujet précédent

Les informations d’environnement

Sujet suivant

Lecture d’un fichier

Cette page