|
Table des matières
CXLVII. SessionsIntroductionLe 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.
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.
Sessions et sécuritéLien externe : Session fixation 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. Pré-requisCes fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
InstallationLe 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.
Configuration à l'exécutionLe comportement de ces fonctions est affecté par la configuration dans le fichier “php.ini”. Tableau 1. Options de configuration
Pour plus de détails sur les constantes PHP_INI_*, reportez-vous à Annexe G. Le système de sessions dispose d’un grand nombre de directives dans le fichier “php.ini”. En voici une présentation : “session.save_handler” string 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”. Noter que les extensions individuelles doivent enregistrer leurs propres gestionnaires de session. Voir aussi session_set_save_handler(). “session.save_path” string 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”.
“session.name” string 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(). “session.auto_start” boolean Spécifie si le module de session doit démarrer automatiquement au début de chaque script PHP. Par défaut, c’est “0” (désactivé). “session.serialize_handler” string 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”. “session.gc_probability” entier “session.gc_divisor” entier “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”. “session.gc_maxlifetime” entier 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.
“session.referer_check” entier 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. “session.entropy_file” string 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. “session.entropy_length” entier Spécifie le nombre d’octets qui seront lus dans le fichier défini ci-dessus. Par défaut, il vaut “0”, c’est-à-dire inactif. “session.use_cookies” boolean Spécifie si le module utilisera les cookies pour stocker les données de session sur le client. Par défaut, il vaut “1”, c’est-à-dire actif. “session.use_only_cookies” boolean 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. “session.cookie_lifetime” entier 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(). “session.cookie_path” string Spécifie le chemin utilisé lors de la création du cookie. Par défaut, il vaut “/”. Voir aussi session_get_cookie_params() et session_set_cookie_params(). “session.cookie_domain” string 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(). “session.cookie_secure” boolean 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(). “session.cookie_httponly” boolean 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). “session.cache_limiter” string 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(). “session.cache_expire” entier 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(). “session.use_trans_sid” boolean Spécifie si le support du SID est transparent ou pas. Par défaut vaut “0” (désactivé).
“session.bug_compat_42” boolean “session.bug_compat_warn” boolean “session.hash_function” ??? “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). Depuis PHP 6.0.0, il est également possible de spécifier n’importe quel algorithme fourni par l’extension hash (s’il est disponible), comme “sha512” ou “whirlpool”. Une liste complète d’algorithmes peut être obtenue avec la fonction hash_algos().
“session.hash_bits_per_character” entier “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, “-”, “,”).
“session.url_rewriter.tags” string 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=”.
Types de ressourcesCette extension ne définit aucune ressource. Constantes pré-définiesCes 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. “SID” (chaîne de caractères) 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. Exemples
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.
<?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']++; } ?>
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. Passer l'identifiant de session (session ID)Il y a deux méthodes de propagation de l’identifiant de session :
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. 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”.
::::<?php if (!session_is_registered(’compteur’)) { session_register(’compteur’); $compteur = 1; } else { $compteur++; } ?> <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.
Gestion personnalisée des sessionsPour 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. Table des matières
session_cache_expire – Retourne la configuration actuelle du cache expiresession_cache_limiter – Lit et/ou modifie le limiteur de cache de sessionsession_commit – Alias de session_write_close() Travail collaboratifContribuez, en ajjoutant des elements a cette page de manuel : Merci de votre aide |