Le support des sessions de PHP est un moyen de préserver
des données entre plusieurs accès. Cela vous permet de
créer des applications personnalisées, et d'augmenter
l'attrait de votre site.
Chaque visiteur accédant à votre page web se voit assigner un
identifiant unique, appelé "identifiant de session". Il peut
être stocké soit dans un cookie, soit propagé dans l'URL.
Le support des sessions vous permet d'enregistrer un
nombre illimité de variables qui doivent être préservées
entre les requêtes. Lorsqu'un visiteur accède à votre site,
PHP va vérifier automatiquement (si
session.auto_start
est activé) ou sur demande (explicitement avec
session_start() ou implicitement avec
session_register()) s'il existe une
session du même nom. Si c'est le cas, l'environnement
précédemment sauvé sera recréé.
Attention
Si vous activez session.auto_start
, alors vous ne pourrez pas enregistrer
d'objets dans votre session tant que la définition de la classe
ne sera pas chargée avant le début de la session, pour recréer les objets
de votre session.
Toutes les variables sont sérialisées après l'exécution du
script PHP. Les variables qui sont indéfinies sont marquées
comme telles. Lors des accès ultérieurs, elles ne seront pas
définies, jusqu'Ã ce que l'utilisateur le fasse.
Avertissement
Quelques types de données ne peuvent pas être linéarisés pour être stockés
dans les sessions. Cela inclut les variables de type resource
ou les objets avec des références circulaires (i.e. objet qui passe une
référence à lui-même à un autre objet).
Note :
La gestion des sessions a été ajoutée en PHP 4.0.
Note :
Notez que lorsque vous travaillez avec les sessions, un enregistrement
dans la session ne sera pas créé tant que la variable ne sera pas
enregistrée en utilisant la fonction session_register()
ou en ajoutant une clé Ã la variable super-globale
$_SESSION. Cela n'est vrai que si vous avez débuté une
session en appelant la fonction session_start().
Utiliser les sessions ne signifie pas que les données de session ne
pourront être vues que par un seul utilisateur. Il est important de
garder cela en tête lorsque vous stockez et affichez des données
importantes. Lorsque vous stockez des données dans une session,
il faut se demander quels seront les problèmes posés si quelqu'un
d'autre accède à cette information, ou comment votre application
est affectée si la session est en fait celle d'un autre.
Par exemple, si quelqu'un usurpe une session, il peut alors poster
un message dans un forum sous une fausse identité. Quelle est la
gravité de ce problème ? Ou bien, il peut accéder aux commandes
d'un client, et même, modifier son panier d'achat. À priori, c'est
moins problématique pour un fleuriste que pour un pharmacien.
Si vous voulez résoudre ce souci de façon simple, il peut être utile
d'activer session.use_only_cookies. Dans ce cas,
les cookies devront être activés par le client, sinon, les sessions ne
fonctionneront pas.
Par conséquent, lorsque vous manipulez des données importantes,
il faut exploiter d'autres méthodes pour décider si une session
est valide ou pas. Les sessions ne fournissent pas une méthode
fiable d'identification.
Les sessions reposent sur un identifiant de session, ce qui signifie
que quelqu'un peut voler cet identifiant, rien qu'en volant l'ID. Ce vol
peut être rendu très difficile, comme en utilisant les
cookies, mais en aucun cas cela sera impossible. Les sessions dépendent
aussi de la discipline de l'utilisateur qui referme son navigateur
à la fin de la session pour tout clore proprement.
De plus, même les cookies de session peuvent être
surveillés sur un réseau, ou bien notés par un proxy car ils transitent en
clair sur le réseau. Pour remédier à cela, vous devriez implémenter un
chiffrage SSL sur votre plate-forme.
Ces fonctions sont disponibles dans le module PHP
standard, qui est toujours accessible.
Note :
Optionnellement, vous pouvez utiliser l'allocation de mémoire partagée
(mm), développé par Ralf S.Engelschall, pour stocker votre session.
Vous devez télécharger mm et l'installer.
Cette option n'est pas disponible pour les environnements Windows.
Notez que le module de stockage de session mm ne garantit pas
les verrous de sessions en cas d'accès multiples à la même session.
Il peut être plus approprié d'utiliser un système de fichiers
basé en mémoire partagée
(comme tmpfs sur Solaris/Linux ou /dev/md sur BSD)
pour stocker les sessions dans des fichiers, car ils seront proprement verrouillés.
Les données de session sont stockées en mémoire ainsi, elles seront effacées
lors du redémarrage du serveur web.
Le support des sessions est activé par défaut. Si vous souhaitez
l'exclure de PHP, vous devez utiliser l'option
--disable-session lors de l'exécution
du script de configuration. Pour utiliser la mémoire vive pour le stockage
des sessions, compilez PHP avec l'option
--with-mm[=DIR] .
La version Windows de PHP
dispose du support automatique de cette extension. Vous n'avez pas à ajouter
de bibliothèque supplémentaire pour disposer de ces fonctions.
Note :
Par défaut, toutes les données relatives à une session particulière seront
stockées dans un fichier du répertoire spécifié par session.save_path
dans les options du fichier php.ini. Un fichier pour chaque session sera créé.
Cela est dû au fait que une session est ouverte (un fichier est créé) mais
aucune donnée n'est écrite dans ce fichier.
Notez que ce comportement est un effet des limitations d'utilisation
du système de fichiers et il est possible qu'un gestionnaire de session
personnalisé (par exemple, un qui utilise une base de données)
ne garde aucune trace des sessions où aucune donnée n'y a été enregistrée.
Définit le nom du gestionnaire
de session qui est utilisé pour stocker et relire les
données. Par défaut, c'est le système intégré
par fichiers : files. Voir aussi
session_set_save_handler().
Définit le chemin qui doit être passé
au gestionnaire de sauvegarde. Si vous décidez de
choisir le gestionnaire par défaut (par fichiers),
cet argument sera utilisé comme dossier de sauvegarde
des sessions. Par défaut, il vaut /tmp.
Voir aussi session_save_path().
Il y a un argument optionnel N Ã cette directive qui détermine
la profondeur de répertoires où votre fichier de session sera stocké.
Par exemple, si vous définissez '5;/tmp', votre fichier
sera situé dans /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If.
Si vous voulez utiliser N, vous devez créer
tous ces répertoires avant de les utiliser. Un petit script shell existe dans
ext/session pour réaliser ces créations et il se nomme
mod_files.sh. Notez également que si N
est utilisé et est supérieur à 0, alors la routine automatique gc (garbage collection)
ne sera pas exécutée ; voir une copie de php.ini pour plus d'informations.
Également, si vous utilisez N, assurez-vous d'entourer
session.save_path de "doubles guillemets" car le séparateur
(;) est également utilisé pour les commentaires dans
php.ini.
Avertissement
Si vous laissez cette option configurée avec un dossier
accessible en lecture à tout le monde, comme
/tmp (par défaut), les autres utilisateurs
pourront exploiter ces sessions en obtenant la liste de fichiers
dans ce dossier.
Note :
Avant PHP 4.3.6, les utilisateurs de Windows doivent changer
cette valeur de variable pour que les fonctions de sessions de
PHP fonctionnent. Indiquez un chemin de dossier valide, par
exemple : c:/temp.
Spécifie le nom de la session,
qui sera utilisé comme nom de cookie. Il ne doit contenir que
des caractères alphanumériques. Par défaut, c'est
PHPSESSID.
Voir aussi session_name().
Définit le nom
du gestionnaire qui est utilisé pour linéariser/délinéariser
les données. Actuellement, le format interne à PHP
(nommé php) et WDDX (nommé
wddx) sont supportés. WDDX est seulement
disponible, si PHP a été compilé avec l'option
WDDX. Par défaut, c'est php.
Spécifie la probabilité, exprimée en pourcentage, en conjonction de
session.gc_divisor, que la routine gc (garbage collection)
soit démarrée à chaque requête. La valeur par défaut est 1.
Voir session.gc_divisor pour plus de détails.
session.gc_divisor en conjonction avec
session.gc_probability définit la probabilité que la routine gc
(garbage collection) soit démarrée à chaque début de session.
La probabilité est calculée en utilisant gc_probability/gc_divisor, par
exemple 1/100 signifie qu'il y a 1 % de chance pour que la routine gc
démarre à chaque requête. La valeur par défaut est 100.
Spécifie la durée de vie des données sur le serveur, en nombre
de secondes. Après cette durée, les données seront considérées
comme obsolètes, et supprimées. Les données deviennent obsolètes
lors du démarrage de la session.
Note :
Si des scripts différents ont des valeurs différentes de
session.gc_maxlifetime mais partagent le même
endroit pour y stocker les données de session, alors, le script dont la valeur
est la plus petite effacera la donnée. Dans ce cas, utilisez cette directive
conjointement avec session.save_path.
Note :
Si vous utilisez le gestionnaire de sessions par fichier,
qui est fourni par défaut, votre système doit garder la trace des
dates de dernier accès aux fichiers (atime). La FAT de Windows ne le
fait pas, il vous faudra donc trouver un autre système pour gérer
les sessions qui ont expiré. Depuis PHP 4.2.3, on utilise
mtime (date de modification) au lieu de atime.
Ainsi, vous n'aurez plus de souci avec les systèmes de fichiers qui ne gèrent
pas atime.
Contient une sous-chaîne
que vous souhaitez retrouver dans tous les en-têtes HTTP Referer. Si
cet en-tête a été envoyé par le client et que la sous-chaîne n'a pas
été trouvée, l'identifiant de session sera considéré comme invalide.
Par défaut, cette option est une chaîne vide.
Est un chemin jusqu'Ã
une source externe (un fichier), qui sera utilisée comme source
additionnelle d'entropie pour la création de l'identifiant
de session. Des exemples valides sont /dev/random et
/dev/urandom, qui sont disponibles sur
tous les systèmes Unix.
Spécifie si le module
doit utiliser seulement les cookies
pour stocker les identifiants de sessions du côté du navigateur.
En l'activant, vous éviterez les attaques qui utilisent des
identifiants de sessions dans les URL. Cette configuration a été ajoutée
en PHP 4.3.0.
Spécifie la durée de vie du cookie en secondes. La valeur de
0 signifie : "Jusqu'Ã ce que le navigateur soit éteint".
La valeur par défaut est 0. Voir aussi
session_get_cookie_params() et
session_set_cookie_params().
Vu que le cookie est retourné par le navigateur, sa durée de vie
n'est pas prolongée. Il doit être envoyé manuellement avec la
fonction setcookie().
Spécifie le domaine utilisé lors de la création du cookie. Par défaut, il ne vaut rien,
cela signifie que c'est le nom de l'hôte du serveur qui génère le cookie en accord
avec les spécifications sur les cookies.
Voir aussi
session_get_cookie_params() et
session_set_cookie_params().
Spécifie que les cookies ne doivent être émis que sur des
connexions sécurisées. Par défaut, cette option est Ã
off. Cette option a été ajoutée en
PHP 4.0.4.
Voir aussi
session_get_cookie_params() et
session_set_cookie_params().
Marque le cookie pour qu'il ne soit accessible que via le protocole HTTP. Cela signifie
que le cookie ne sera pas accessible par les langage de script, comme Javascript.
Cette configuration permet de limiter les attaques comme les attaques XSS (bien
qu'elle n'est pas supporté par tous les navigateurs).
Spécifie le type de
contrôle de cache utilisé pour les pages avec sessions. Les
valeurs possibles sont :
none, nocache, private, private_no_expire, public. Par défaut, il vaut
nocache.
Voir aussi
session_cache_limiter().
Spécifie la durée de
vie des données de sessions, en minutes. Cette option n'a aucune
conséquence sur le contrôle de cache. Par défaut, il vaut
180 (3 heures).
Voir aussi
session_cache_expire().
Spécifie si le support du SID est transparent ou pas. Par défaut vaut 0
(désactivé).
Note :
En PHP 4.1.2 ou plus ancien, cette option est activée en utilisant
l'option de compilation --enable-trans-sid.
Depuis PHP 4.2.0, cette option est toujours activée.
Le système de gestion des sessions par URL pose un risque
supplémentaire de sécurité : un utilisateur peut envoyer
son URL avec l'identifiant de session par email à un ami,
ou bien le mettre dans ses signets. Cela diffusera alors
l'identifiant de session.
Les versions de PHP antérieures à la version 4.2.3
disposaient d'une
fonctionnalité/bogue non documentée, qui vous permettait
d'initialiser une variable de session dans le contexte global, même si
register_globals
était désactivé. PHP 4.3.0 et plus récent vous préviendra de l'utilisation
de cette fonctionnalité si vous avez aussi activé
session.bug_compat_warn.
Cette fonctionnalité/bogue peut être désactivée en désactivant cette directive.
Les versions de PHP antérieures à la version 4.2.3
disposaient d'une
fonctionnalité/bogue non documentée, qui vous permettait d'initialiser
une variable de session dans le contexte global, même si
register_globals
était désactivé. PHP 4.3.0 et plus récent vous préviendra de l'utilisation
de cette fonctionnalité si vous avez activé
session.bug_compat_42
et session.bug_compat_warn.
session.hash_function vous permet de spécifier la fonction
de hachage à utiliser pour générer les identifiants de session. '0' signifie
MD5 (128 bits) et '1' signifie SHA-1 (160 bits).
session.hash_bits_per_character vous permet de définir
le nombre de bits utilisés pour chaque caractère lors des conversions des
données binaires en éléments lisibles. Les valeurs possibles sont '4' (0-9,
a-f), '5' (0-9, a-v), et '6' (0-9, a-z, A-Z, "-", ",").
Spécifie quelles sont les balises HTML qui doivent
être réécrites si le support transparent du SID
est activé. Par défaut, il vaut
a=href,area=href,frame=src,input=src,form=fakeentry,fieldset=.
Note :
Si vous voulez vous conformer aux spécifications XHTML, supprimez l'entrée
form et utilisez le tag <fieldset> autour de votre balise
form.
Les options track_vars et
register_globals
influencent le comportement des sessions, leur stockage et leur restauration.
Note :
Depuis PHP 4.0.3, track_vars est
toujours activé.
Ces constantes sont définies par cette
extension, et ne sont disponibles que si cette extension a été compilée avec
PHP, ou bien chargée au moment de l'exécution.
Constante contenant le nom de la session et l'identifiant en cours,
sous la forme "name=ID" ou une chaîne vide si l'identifiant de session
a été défini dans un cookie de session.
Note :
Depuis PHP 4.1.0, $_SESSION est disponible comme
variable globale, au même titre que $_POST,
$_GET, $_REQUEST, etc.
Contrairement à $HTTP_SESSION_VARS,
$_SESSION est toujours globale. Par conséquent, vous
n'avez pas besoin d'utiliser le mot réservé
global
avec $_SESSION. Notez que cette documentation
a été modifiée pour utiliser $_SESSION.
Vous pouvez toujours le remplacer par
$HTTP_SESSION_VARS si vous préférez l'ancienne version.
Notez également que vous devez démarrer votre session en utilisant la fonction
session_start() avant d'utiliser
la variable super-globale $_SESSION.
Les clés du tableau $_SESSION sont sujettes
aux mêmes limitations que les variables PHP habituelles, c'est-Ã -dire
qu'elles ne peuvent pas commencer par un nombre, mais commencer par
une lettre ou un souligné '_'. Pour plus de détails, reportez-vous Ã
la section sur les variables.
Si track_vars est
activé et register_globals
est désactivé, seuls les éléments du tableau global
$_SESSION contiendront les variables
enregistrées dans la session. Les variables de sessions relues seront
uniquement disponibles dans $_SESSION.
L'utilisation de $_SESSION (ou
$HTTP_SESSION_VARS avec PHP 4.0.6 et plus ancien) est
recommandé pour une meilleure sécurité et un code plus facilement
entretenu. Avec $_SESSION, il n'y a pas besoin
d'utiliser les fonctions session_register(),
session_unregister() et
session_is_registered(). Les variables de sessions
sont accessibles comme toute autre variable.
Exemple 1.
Enregistrer une variable avec $_SESSION.
<?php session_start(); // Utilisez $HTTP_SESSION_VARS avec PHP 4.0.6 ou plus ancien if (!isset($_SESSION['compteur'])) { $_SESSION['compteur'] = 0; } else { $_SESSION['compteur']++; } ?>
Exemple 2.
Retirer une variable de session avec $_SESSION et register_globals inactif.
<?php session_start(); // Utilisez $HTTP_SESSION_VARS avec PHP 4.0.6 ou plus ancien unset($_SESSION['compteur']); ?>
Attention
N'utilisez PAS la fonction unset()
avec $_SESSION sous la forme
unset($_SESSION) sinon, cela rendra impossible
l'enregistrement de données dans la session en utilisant la super-globale
$_SESSION.
Avertissement
Vous ne pouvez pas utiliser les références sur des variables de session
car il n'y a aucune manière faisable de restaurer une référence vers une
autre variable.
Si register_globals
est activé, alors toutes les variables globales peuvent être
enregistrées comme variables de session, et toutes les variables de
sessions seront reconstituées comme variables globales. Comme PHP doit
savoir quels variables globales sont enregistrées comme variables
de sessions, l'utilisateur doit enregistrer les variables avec
session_register() tandis que
$HTTP_SESSION_VARS et $_SESSION
ne nécessitent pas session_register().
Désactiver
register_globals
est recommandé pour des raisons de sécurité et de performances.
Si register_globals
est activé, alors les variables globales et les entrées dans le tableau
$_SESSION seront des références sur la même valeur pour
les valeurs qui auront été enregistrées avant le démarrage de la session
(donc, dans les page précédentes). Cependant, si la variable a été enregistrée
avec $_SESSION, alors, la variable globale est disponible
jusqu'Ã la prochaine requête.
De plus, si vous enregistrez une nouvelle variable avec la fonction
session_register(), l'entrée dans l'environnement
global et $_SESSION ne fera pas de référence vers la
même valeur jusqu'Ã la prochaine utilisation de
session_start() (ceci s'applique à PHP 4.2 et
avant seulement). C'est à dire qu'une modification dans les variables
globales ne sera pas répercutée dans les entrées de
$_SESSION. Il est peu probable que cela ait un impact en
pratique et, de plus, cela a été corrigé en PHP 4.3.
Il y a deux méthodes de propagation de l'identifiant de session :
Cookies
Par URL
Le module de session supporte les deux méthodes. Les cookies sont
optimaux, mais comme ils ne sont pas sûrs (tous les internautes
ne les acceptent pas), ils ne sont pas fiables. La seconde
méthode place l'identifiant de session directement dans les URL.
PHP est capable de faire cela de manière transparente, lorsqu'il est
compilé avec l'option --enable-trans-sid. Si vous activez
cette option, les URL relatives seront modifiées pour contenir
l'identifiant de session automatiquement. Alternativement,
vous pouvez utiliser la constante SID, qui est
définie, si le client n'a pas envoyé le cookie approprié.
SID est soit de la forme
session_name=session_id ou une chaîne vide.
Note :
L'option arg_separator.output
de php.ini vous permet de personnaliser le séparateur d'arguments.
Pour être complètement en accord avec les spécifications XHTML, spécifiez
& ici.
Alternativement, vous pouvez utiliser la constante SID
qui est définie si la session a commencé. Si le client n'envoie pas un cookie de session
approprié, il aura la forme session_name=session_id.
Sinon, il vaudra une chaîne vide. Ainsi, vous pouvez dans tous les cas
l'inclure dans l'URL.
L'exemple suivant vous montre comment enregistrer une variable et comment
réaliser un lien correct avec une autre page, avec
SID.
Exemple 3. Compter le nombre de passages d'un utilisateur sur une page
<p> Bonjour visiteur, vous avez vu cette page <?php echo $compteur; ?> fois. </p>
<p> Pour continuer, <a href="nextpage.php?<?php echo strip_tags(SID); ?>">cliquez ici</a>. </p>
La fonction strip_tags() est utilisée lors de l'affichage
du SID dans le but de contrer les attaques XSS.
L'affichage du SID, comme montré dans l'exemple
ci-dessus, n'est pas nécessaire si --enable-trans-sid a été utilisé pour compiler
PHP.
Note :
Les URL non-relatives sont considérées comme externes au site, et ne
recevront pas le SID, car c'est une fuite
d'informations vers un autre site (envoi d'informations importantes).
Pour implémenter un stockage en base de données, ou toute autre méthode,
vous aurez besoin de la fonction
session_set_save_handler() pour
paramétrer vos propres fonctions de stockage.