trucs et astuces

les sessions avec php

Ceci est la traduction d'un tutorial de Zend Company, traduit de l'anglais. SESSIONS ET COOKIES SOUS PHP : LES SECRETS ************************************ Par : Vikram Vaswani (Zend company) Traduit de l'anglais par Magidev (magidev@hotmail.com) La première session Un des exemples standards utilisés pour démontrer comment fonctionne un session, est une application d'incrémentation de compteur. C'est un simple compteur qui initialise une variable la première fois que vous visitez une page web et qui s'incrémente a chaque fois que vous rechargez la page. La variable compteur est stocké dans une session, ce qui signifie que si vous naviguez sur un autre site web et que vous retournez sur cette page, la valeur du compteur sera restaurée (aussi longtemps que vous ne détruisez pas la session en fermant le navigateur. Regardez ce code : Pour voir comment ca marche, appelez le script plusieurs fois depuis votre navigateur. Vous remarquez que le compteur monte de 1 a chaque rechargement. Si vous ouvrez deux fenetre de votre navigateur, et que vous ouvrez la meme page, PHP maintiendra et incrémentera la meme session individuelle pour les deux fenêtres. L'ID de session est utilisé pour identifier quel client a fait quelle requête, et recréer la priorité de chaque environnement sauvegardé pour chaque session individuelle. Cela veut également dire que si vous visitez un (ou plusieurs) autre sites durant la même session et que vous retournez à votre script sans fermer votre navigateur entre temps, votre ancienne session sera retrouvée et récrée pour vous. Chaque session en PHP commence avec la fonction d'appel de session session_start(). Cette fonction vérifie si une session n'existe pas déja et la restore (si elle la trouve) ou en recréer une (si elle n'existe pas). Les variables session peuvent etre enregistrées en utilisant le tableau superglobal $_SESSION, et peut etre appelé a n'importe quel moment durant la session en utilisant les spécification de tableau classiques. Dans l'exemple ci-dessus, une clé nommée counter a été ajoutée au tableau $_SESSION. La première fois qu'une session est crée, cette clé à obtenu la valeur 0. A chaque appel de la même session, la valeur précédente du compteur est retrouvée et incrémentée de 1. Si l'exemple ne fonctionne pas comme expliqué, vérifiez que la variabe session.save_path de votre fichier php.ini pointe sur un dossier temporaire valide sur votre système. Cette valeur est attribuée par défaut sur /tmp, mais si vous désirez essayer cet exemple sous un système Windows, vous devrez editer cette valeur pour C:\Windows\temp\ (où un dossier temporaire sur votre système) Rappelez-moi Voici un autre exemple, celui-ci demande a l'utilisateur de s'identifier et stocke le login et l'heure de début de session dans deux variables. Cette information est utilisée pour afficher le nombre total de minutes depuis lesquelles la session est active
ici pour actualiser."; } else { echo "ERREUR: Entrez votre nom!"; } } else if (isset($_SESSION['name'])) { // Si un session existait déja // Calcule le temps passé entre les deux visites echo "Bienvenue a nouveau, " . $_SESSION['name'] . ". Cette session à été activée il y a " . round((time() - $_SESSION['start']) / 60) . " minute(s). Cliquez ici pour afficher la page."; } ?> Dans cette exemple, la présence ou non de variable session est utilisée pour déterminer laquelle des trois options afficher. Le temps de départ de la session est aussi enregistrée dans $_SESSION['start'] avec la fonction time(), qui retourne le nombre total de seconde entre le 1 Janvier 1970 et l'heure courante. La seconde étape calcule le temps passé entre maintenant et le temps stocké dans $_SESSION['start'] et l'arrondi pour afficher le temps approximativement écoulé. C'est important de noter que l'appel de session_start() DOIT apparaitre en premier, avant toute sortie générée par le scription (incluant que vous n'utilisez pas la fonction de mise en cache des sorties PHP comme vous pouvez lire à http://www.php.net/manual/en/ref.outcontrol.php. Ceci est du fait que la fonction de maintient des sessions dans PHP utilise des cookies mémoires pour gérer les sessions, et les en-tête de cookies doivent etre transmises avant quelque sortie client qu'il soit. Si vous voyez une erreur comme celle-ci dans les pages utilisant vos sessions : Warning: Cannot send session cache limiter - headers already sent (output started at ...) c'est probablement que quelque part, d'un manière ou d'une autre, des sorties ont été trouvées avant l'appel du session_start(). Parfois un retour charriot ou un espace blanc en dehors des balises php entourant le session_start() peut causer l'erreur, donc soyez vigilant. Comme dit précédement, chaque session possède un ID de session unique, que PHP utilise pour garder les valeurs de chaque client. Cet ID de session est une longue chaine alphanumérique automatiquement passée par PHP depuis la page qui utilise les sessions. Pour voir a quoi cela ressemble, utilisez la fonction session_id(), comme dans ce simple exemple : Quand l'utilisateur ferme son navigateur et détruit les sessions, le tableau $_SESSION est vidé de toutes ses valeurs et variables. Vous pouvez également détruire vous même une session, par exemple quand l'utilisateur se déconnecte (ndlr: Il clique sur un lien Fermer la session) en appelant la fonction session_destroy(), comme dans l'exemple suivant : Dans ce cas, vous vous demandez si ce que vous lisez ci-dessus est exact... Oui ! Avant d'appeler la fonction session_destroy() vous devez d'abord rappeler la fonction session_start() pour recupérer la session courante. RAPPELEZ-VOUS : $_SESSION est un tableau superglobal, et vous pouvez utiliser toutes les fonctions internes et externes sans le déclarer comme global au préalable. Dans le simple exemple suivant, vous allez voir : "; // attribue la valeur a r $_SESSION['name'] $_SESSION['name'] = "admin"; // appel la fonction en utilisant la variable session // retourne vrai ici echo isAdmin()."
"; ?> Vous pouvez en lire plus a propos des sessions et de leur maintient a http://www.php.net/manual/en/ref.session.php. Règles du jeu Une session fonctionne en utilisant un cookie mémoire, ce qui explique qu'il n'est disponible que tant que une fenetre de navigateur est toujours active. Quand le navigateur est éteint, la mémoire allouée au cookie est vidée et la session détruitre. Si vous voulez utiliser des cookies de plus longue durée, vous devez utiliser les fonction PHP de cookies pour écrire un cookie sur le disque dur de l'utilisateur, et le relire au besoin. Avant de commence à utiliser les cookies, il y a quelques points sur lequels il faut etre vigilant : Quand les cookies sont utilisée pour enregistrer les valeurs d'un certain domaine, ils ne peuvent etre relus que par le domaine qui les à crées (ndlr : Domaine = l'adresse web, le domaine propriétaire) Un même domaine ne peut créer plus de 20 cookies, et chaque cookie est limité à la taille de 4 KB Un cookie possède habituellement six attributs, le premier est le mandataire. Il y a : name : le nom du cookie value : la valeur du cookie expires : la date et l'heure a laquelle le cookie expire path : le dossier dans lequel le domaine peut accéder au cookie domain : le domaine dans lequel le cookie est valide secure : un marqueur booléen indiquant si le cookie ne peut etre transmit que pas connexion sécurisée Plus d'informations sur les cookies peuvent être obtenus depuis Netscape, les personnes qui les ont inventée. Visitez http://www.netscape.com/newsref/std/cookie_spec.html pour connaitre les spécificiations Netscape. C'est important de se rappeler que, quand le cookie est écrit chez l'utilisateur, vous êtes le programmeur qui a le plus petit contrôle de ceux-ci. Si un utilisateur décide de désactiver les cookies dans son navigateur, vos cookies ne seront simplement pas sauvegardés. Maintenant que vous savez cela, jetons un oeil sur l'utilisation des cookies dans PHP Retrouver de vieux amis PHP offre une seule fonction manipulant les cookies : setcookie(). Cette fonction vous autorise a lire et ecrire des cookies, comme dans l'exemple : Pour voir comment cela fonctionne, appelez votre pages plusieurs fois, La premiere fois, parceque le cookie n'existait pas encore, le premier message est affiché, mais pour la suite, le client reconnait le cookie déja écrit et affiche le second message. NOTE : Ceci fonctionne meme si vous fermez le navigateur entre temps, voila la différence avec les sessions La fonction setcookie() accepte 6 arguments : le nom du cookie, sa valeur, sa date d'expiration, le domaine, le dossier pour le quel c'est valable et une valeur booléene indiquant si le cookie peut ou non etre transmis par le biais de protocoles HTTP non sécurisés. Comme expliqué précédement, seulement le nom et la valeur sont nécéssaires, les autres sont facultatifs La valeur des cookies est automatiquement envoyée au client et convertis en une paire de CLEF-VALEUR dans la variable $_COOKIE, comme un tableau superglobal identique a $_SESSION. Les valeur peuvent etre retrouvées grace à la notation standard des tableaux, comme dans l'exemple ci-dessus. NOTE : Comme pour les sessions vous devez appeler la fonction setcookie() avant toute sortie, sinon vous aurez l'erreur suivante : Warning: Cannot add header information - headers already sent by (output started at ... ) Formulaire et Fonction Voici un exemple un peu plus complexe:
Enter your email address: $days jour(s) depuis votre dernier envoi"; } ?>
Dans ce cas, les valeurs entrées dans la feuille sont stockés dans une cookie appelé email, et automatiquement retrouvée pour pré-remplir le formulaire avant la requete. Cette technique est fréquement utlisée par les sites qui requièrent un login et un mot de passe, pré-remplissant ainsi le nom d'utilisateur dans la boite de login avec la valeur stocké dans le cookie depuis la dernière identification réusssie. Cet exemple démontre également comme stocker plus d'un cookie par domaine, en appelant setcookie() plusieurs fois. Dans l'exemple ci-dessus, le temps que prend l'utilisateur pour remplir le formulaire est stocké dans un second cookie pour calculer le temps entre deux entrées. Pour supprimer un cookie chez le client, appelez simplement setcookie() avec la meme syntaxe, mais définissez une date de validité dans le passé. Cela provoque la suppression du cookie chez le client. Voici un exemple : Lisez-en plus a propos des cookies et de la fonction setcookie a : http://www.php.net/manual/en/features.cookies.php et http://www.php.net/manual/en/function.setcookie.php. Accès autorisé Comme je l'ai dit au début de ce tutorial, les cookies et les sessions sont deux modes différents pour stocker des données "persistantes" chez le client. Une session retient les données pour le temps d'une session, un cookie retient les données pour autant de temps que vous avez besoin. En sachant cela, jetons un oeil sur l'exemple suivant, qui utilise conjointement les deux méthodes : L'application est une simple identification. Avec certaines pages visibles seulement aux utilisateur identifées avec succès. Les utilisateurs non identifées avec un mot de passe valide sont redirigés vers une page d'erreur spéciale. La liste des noms d'utilisateurs et des mots de passe sont stockés dans une base MySQL et php vérifie si il peut accorder ou non l'accès The application here is a simple user authentication system, where certain pages can only be viewed by users who successfully log in to the system. Users who have not been authenticated with a valid password are denied access to these "special" pages. The list of valid usernames and passwords is stored in a MySQL database, and PHP is used to verify a user's credentials and decide whether or not to grant access. On présume qu'une table comme ceci existe : +-------+-----------------------------------------------+ | name | pass | +-------+-----------------------------------------------+ | sue | 9565d44fd0fe4db59f073eea1db70f3ea258e10b | | harry | 6e74234b8b552685113b53c7bff0f386c8cef8cf | | louis | 6817dda51b64b8190029490d2811a4d9cb9cd432 | | sam | bd17f8243e771a57cfbb06aa9a82bbf09fd2d90b | | james | 792ec9b44d432c947ac6775b2b52326e9d08512f | +-------+-----------------------------------------------+ avec un champ unique de nom d'utilisateur et un mot de passe crée avec la fonction SHA1(). Ici php va faire le gros du travail :
Username

Password

Ici, les valeurs entrées dans la boite de login sont intégrée dans une requete mySQL, qui est executée sur la table user. Si le nom et le mot de passe correspondent, un seul enregistrement est retourné, indiquant que l'authentification est accordée, si aucun enregistrement n'est retourné, c'est que l'authentification a échou Quand l'authentification reussi, une session est créer : $_SESSION['auth'] est créer et assigné a la valeur booléene true, et le nom d'utilisateur est stocké dans un cookie pour la prochaine fois, le cookie dure 30 jours, et est utilisé pour pré-remplir le champ Login pour la fois suivante. Bien sur ce n'est pas assez, il faut maintenant bloquer les pages interdites si l'utilisateur n'est pas identifiée. Sans cela, n'importe qui peut passer la sécurité en tapant simplement l'adresse de la page dans l'URL. Maintenant, pour protéger une page, il suffit de vérifier que la variable $_SESSION['auth'] existe et d'autoriser l'acces ou non Ceci est une page sécurisée. Vous pouvez seulement la voir si $_SESSION['auth'] = 1 Chouette non ? Seul les utilisateurs loggés sont autorisés a voir cette page, parceque leur clients on la session $_SESSION['auth'] a la valeur 1 en mémoire. Tout les autres auront la page d'erreur. Voici la fin de ce tutorial.


27/01/2007
0 Poster un commentaire

Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 80 autres membres