Sessions PHP et cookie

Pour commencer par ce qui a été ma première question, lorsque je me suis intéressé aux sessions, il s'agit d'un cookie côté serveur, contenu dans un répertoire ad hoc (généralement tmp). La gestion de ce cookie particulier, contenant toutes les variables que le script lui aura transmis, est déterminée selon une alternative : l'ID de la session en cours (constante SID http://us2.php.net/manual/fr/ref.session.php#session.idpassing) est contenue dans un cookie côté client ou, quand ce dernier a désactivé les cookies, dans l'URL (si l'option est implémentée dans le php.ini). La doc de www.php.net explique ces options.

Usage

Sans parler des paniers électroniques, des forums, voire des interfaces d'administration, une session PHP est extrêmement pratique pour proposer des options d'affichage, comme c'est le cas pour ces modestes pages. Par exemple, au cas où vous ne l'aurez pas remarqué, vous pouvez afficher cette page sur fond blanc. Quand il fallait, avant PHP 4.0, suivre un client à l'aide d'une base de données, il suffit maintenant d'un maigre cookie pour y parvenir ; sans remettre en cause MySQL pour conserver certaines traces (utilisables à la prochaine visite).

NB : pour utiliser les sessions chez Free, il vous faut créer le répertoire "session" à la racine de votre site !

Sécurité

Comme il est dit dans l'URL citée plus haut, une session PHP (ou un cookie) n'est pas un gage total de sécurité, surtout quand on n'utilise pas un protocole HTTP sécurisé : les variables qui y sont contenues doivent être bien pensées, afin de ne pas risquer la casse ! Evitez de stocker les mots de passe, ou alors codés, avec md5() http://fr2.php.net/md5 par exemple.

Fichier session.php

<?php
/*
ce fichier doit être chargé avant tout envoi d'une en-tête HTTP
un espace avant la balise PHP et c'est l'erreur fatale !
*/
# démarrage de la session
session_start();

# définition d'une date de validité pour le cookie sinon
# il ne sera valable que jusqu'à la fermeture du navigateur
# comme la session, d'ailleurs
$cookieDate = time() + 31536000; // valable un an

if( empty($_COOKIE['c_lastvisit']) ) {
   # il s'agit d'un nouveau visiteur :
   # création du cookie et d'une session
   # à la date courante
   $_SESSION['s_lastvisit'] = time();
   setcookie('c_lastvisit', time(), $cookieDate);
} elseif( empty($_SESSION['s_lastvisit']) ) {
   # il s'agit d'un visiteur connu :
   # mise à jour de la session selon cookie 
   $_SESSION['s_lastvisit'] = $_COOKIE['c_lastvisit'];
   $_SESSION['s_menu'] = $_COOKIE['c_menu'];
   # mise à jour du cookie (la date courante)
   setcookie('c_lastvisit', time(), $cookieDate);
}

# l'utilisateur demande un autre menu
# ou une session 's_menu' n'a pas été implémentée
if ( isset($_GET['menu']) || !isset($_SESSION['s_menu']) ) {
   $_SESSION['s_menu'] = 1;
   if($_GET['menu'] == 2)
      $_SESSION['s_menu'] = 2;
   # on mémorise la config dans un cookie
   setcookie('c_menu', $_SESSION['s_menu'], $cookieDate);
}

/*
Affichage et traitement :
quand vous rechargez la page ou quittez le navigateur
le choix ne change pas et votre date de visite est précisée
*/
echo "<html><head>\n<title>Test</title>\n</head><body>\n";
if($_SESSION['s_menu'] == 1) {
   echo "<p>Voici un lien : \n";
   echo "<a href=\"?menu=2\">voir un second</a></p>\n";
   echo "<p>Recharger la <a href=\"".
      $_SERVER['PHP_SELF']."\">page</a>\n";
   echo "<br>Dernière visite le ".
      date("d.m.Y à H:i",$_SESSION['s_lastvisit'])."</p>\n";
} else {
   echo "<p>Voici un second lien : \n";
   echo "<a href=\"?menu=1\">revoir le premier</a></p>\n";
   echo "<p>Recharger la <a href=\"".
      $_SERVER['PHP_SELF']."\">page</a>\n";
   echo "<br>Dernière visite le ".
      date("d.m.Y à H:i",$_SESSION['s_lastvisit'])."</p>\n";
}
echo "</body></html>";
?>

Session conditionnelle

<?php
/*
Si l'on ne souhaite pas activer une session au passage de certains robots
ou les orienter, on peut configurer le fichier de session ainsi :
*/
# tableau de robots à surveiller
$userAgent = array(
   "Googlebot", 
   "Slurp", 
   "Fast", 
   "Scooter", 
   "VoilaBot", 
);
# un internaute par défaut...
$isRobot = false; 
foreach($userAgent as $spider)  { 
   if (stristr($_SERVER['HTTP_USER_AGENT'],$spider)) { 
      # c'est un spider référencé
      $isRobot = true;
      break; 
   }
}
# dans ce cas pas de session (ni ID, ni cookie)
if(!$isRobot)
   session_start();
?>

http://dev.ppan.net [Haut de page] [Document mis à jour le 11.06.2010]