Aller au contenu

Base

Rappel sur le protocole HTTP

Le protocole HTTP est stateless. Cela signifie qu’il ne s’occupe pas de maintenir un "état de la conversation en cours" entre le client et le serveur.

En d'autres termes, lorsqu'un client HTTP (ex: browser) émet une requête vers un serveur HTTP, celui-ci lui répond indépendamment de toute réponse/requête ayant pu avoir eu lieu précédemment entre ce même client et le serveur.

Il n'est donc pas possible pour le serveur, en s'appuyant uniquement sur le protocole HTTP, de se souvenir d'informations préalablement envoyées par le client et, éventuellement de générer une réponse "personnalisée".

Une application web a souvent besoin de pouvoir maintenir un état. Les usages fréquents sont de retenir la langue souhaitée par l'utilisateur, de garder l'identité d'un utilisateur authentifié ou encore de conserver les articles sélectionnés dans un panier d'achats.

Différentes méthodes de conservation d'état

Jusqu'à présent nous avons déjà utilisé deux techniques pour conserver de l'information lors du chargement d'une page :

  • Les champs cachés dans un formulaire

  • Les paramètres d'URL

L'information à "retenir" est placée systématiquement dans le corps de la réponse. Mécanisme fastidieux et peu sûr car il nécessite de récupérer les valeurs des champs cachés et les recopier dans la réponse générée.

Exemple d'utilisation de champs caché pour conserver le nom de l'utilisateur courant
<?php 
//fichier user.php
  $username = isset($_POST['username']) ? $_POST['username'] : (isset($_GET['username']) ? $_GET['username'] : '');
  (...)
?>
(...)
<main>
   <h2>Ajout d'un responsable</h2>
   <?php if (!empty($message)) echo "<p>$message</p>"; ?>
   <form method="post" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" autocomplete="off">
      <input type="hidden" name="username" value="<?php echo $username; ?>"/>
      <label>
        <span>Nom</span>
        <input type="text" name="newusername" value="" placeholder="Nom d'utilisateur" autocomplete="off"/>
      </label>
   (...)
   </form>

Paramètres d'URL

L’information à "retenir" transite dans le "query string". Ici aussi, les paramètres doivent être systématiquement récupérés et recopiés.

Exemple d'utilisation de paramètres d'URL pour passer le nom de l'utilisateur courant
<?php 
//fichier tasks.php
(...)
  if (isset($_POST['buttUserForm'])) {
    header('location: user.php?username='.$username);
  }
(...)
//fichier user.php
(...)
  $username = isset($_POST['username']) ? $_POST['username'] : (isset($_GET['username']) ? $_GET['username'] : '');
(...)   
?>

D'autres techniques existent

Cependant ces deux techniques sont parfois trop laborieuses à mettre en place ou ne sont pas suffisamment sécurisées. En effet, l'utilisateur peut facilement modifier la valeur d'un paramètre d'une URL ou changer la valeur d'un champ de formulaire.

L'objet de ce chapitre et du suivant est de vous présenter deux techniques:

  • Les cookies

  • Les sessions

Cookies

Un cookie est une information textuelle enregistrée du côté du client par son navigateur. Initialement, le cookie est construit par le serveur et envoyé au client via l'entête HTTP. Ensuite, le navigateur le renvoie inchangé à chaque fois qu'il accède à une ressource du même domaine que le cookie.

Un cookie est décrit par plusieurs attributs dans l'entête Set-Cookie de la réponse HTTP :

  • nom: seul attribut obligatoire (identifie le cookie)

  • expires: permet de donner une date d'expiration du cookie. Si cet attribut n'est pas spécifié, le cookie disparaîtra lorsque l'utilisateur ferme son navigateur

  • domain: indique le domaine auquel est associé le cookie. Par défaut, cet attribut prendra la valeur du serveur présente dans l'URL

  • path: permet de restreindre le champ d'action du cookie à un chemin (sous-répertoire et/ou fichier)

  • secure: permet de spécifier que le cookie doit être utilisé uniquement sous connexion sécurisée (HTTPS)

contenuCookies
Exemple de contenu de cookies liés à helmo.be

Avantages et inconvénients

Avantages

  • Les cookies offrent un moyen simple de stocker de petites quantités d'information sur les postes clients

  • On peut ajuster la durée de vie des cookies (leur durée de vie peut être très longue)

Inconvénients :

  • Le nombre et la taille des cookies acceptés par poste et par domaine est limité
  • Les cookies peuvent être désactivés sur les navigateurs
  • Les cookies peuvent être effacés par l'utilisateur
  • Les cookies peuvent être modifiés ou échangés voire "volés" et envoyés à un site tiers (javascript).
  • Vie privée: les cookies peuvent être utilisés pour "tracer votre navigation"

Visualisation des cookies avec Firefox
Visualisation des cookies avec Firefox

PHP & Cookies

La création ou la modification d'un cookie en PHP s'effectue grâce à la fonction suivante

bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]])

  • $name *et *$value : nom et valeur donnée au cookie

  • $expire : date d'expiration du cookie

  • $path et $domain : domaine et chemin pour lesquels le cookie est disponible

  • $secure : indique si le cookie est uniquement disponible sous HTTPS

  • $httponly : limite l'accès au cookie au protocole HTTP et non au JavaScript

Référence officielle >>

Pour supprimer un cookie, on lui affecte une valeur vide *et on lui donne une *date d’expiration dans le passé.

<?php 
setcookie("langue", "fr"); //ce cookie expire dès la fermeture du navigateur
setcookie("meteo", "soleil", time()+3600); //ce cookie expire dans 1 heure
setcookie("compte", "", time()-3600); //ce cookie est rendu obsolète et est donc supprimé
?>
<html>
   <head>
   (...)

Lecture des cookies

L'ensemble des cookies sont accessibles via un tableau superglobal : $_COOKIE dont les clés sont les noms des cookies présents dans l'entête de la requête.

<?php 
<?php
(...)
$sort = $_COOKIE['sort'];
(...)