Apprendre PHP (12/19) - Les variables de session (avec exemple d'authentification)

Dans cette leçon vidéo, le formateur explique le fonctionnement des variables de session en PHP. Il montre comment initialiser une session avec sessionstart, comment stocker et récupérer des valeurs via le tableau superglobal $SESSION, et insiste sur le fait que sessionstart (et toute fonction renvoyant des en‑têtes HTTP comme header) doit être placé avant tout affichage. Il illustre la persistance des données entre deux pages (page1.php et page2.php) puis introduit la fonction sessiondestroy pour supprimer toutes les variables de session. Le cours se poursuit avec un exemple complet d’authentification : un formulaire login.php qui vérifie des identifiants statiques, crée une variable de session "autorisé" et redirige vers une page protégée session.php ; cette page vérifie la variable de session et redirige vers le login si l’accès n’est pas autorisé. Un script de déconnexion (deconnexion.php) détruit la session et renvoie à la page de login. Enfin, le formateur aborde la sécurité en montrant comment hacher le mot de passe avec MD5, explique la différence entre hachage et chiffrement, et montre comment comparer le hash de l’entrée utilisateur avec le hash stocké. Le tout est présenté de façon pédagogique, avec des démonstrations en direct et des explications sur les relations entre sessions, cookies et en‑têtes HTTP.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon de PHP. Aujourd'hui, nous allons voir les variables de session. Imaginez que vous vouliez que le serveur se souvienne d'une valeur donnée afin de la récupérer quelle que soit la page sur laquelle vous vous rendez. Pour faire un tel traitement, la solution idéale en PHP consiste à l'utilisation des variables de session. Une variable de session est une variable superglobale que le serveur mémorise. Cette variable appartient à la session de l'utilisateur. Par conséquent, elle est disponible tant que la session de l'utilisateur est maintenue sur le serveur. Pour mieux comprendre le principe, imaginons que nous avons 2 pages différentes, une qui s'appelle page1.php et l'autre qui s'appelle page2.php. Maintenant, on va se rendre dans le code de page1.php qui contient juste une balise H1 et on va essayer d'y déclarer une variable de session que l'on va récupérer ensuite dans page2.php. Alors on va ouvrir un script PHP comme ceci, puis on va initialiser notre variable de session avec une valeur quelconque. Bon, pour déclarer la variable de session on fait appel au tableau superglobal SESSION comme ceci. Ça nous rappelle un peu la forme des variables POST et GET. En réalité, $_SESSION est une variable superglobale qui est un tableau associatif dont la clé correspond à la variable que l'on veut manipuler. Dans ce cas on va mettre par exemple ma_var pour dire que c'est la variable de session que je veux enregistrer. Et maintenant je mettrai dedans la valeur Session de test par exemple. Voilà comme ceci. Alors maintenant je viens de créer une variable de session dont le nom est $_SESSION ma_var qui contient une chaîne de caractères dont la valeur est Session de test. Mais pour que ce code fonctionne il faut d'abord initialiser les sessions. Et pour faire ceci on va faire appel à la fonction session_start comme ceci. Session_start est une fonction qui permet d'initialiser une nouvelle session ou de rétablir une session déjà existante. Mais notez que la fonction session_start est une fonction qui renvoie des en-têtes HTTP, c'est-à-dire qu'il faut la déclarer avant d'envoyer quoi que ce soit au navigateur. Par exemple, dans notre cas, nous avons déjà écrit un texte qui est le titre H1 et ensuite on a déclaré la fonction session_start qui va envoyer des en-têtes HTTP. Et comme vous le savez tous, les en-têtes doivent être envoyées en premier avant de charger n'importe quel contenu utile. Alors dans ce cas, ça va générer une erreur. Alors quand j'exécute, ça me donne bien le message que des en-têtes ont déjà été envoyées. En réalité, le serveur envoie ses propres en-têtes d'une manière automatique et nous, en déclarant la fonction session_start, nous avons envoyé d'autres en-têtes. Mais le problème, c'est qu'entre les en-têtes du serveur et nos propres en-têtes, nous avons déjà intégré un message utile et ça se fait pas. Alors il faut en réalité placer cette ligne au tout début du code. Alors on va retirer ce code de cet endroit et on va le mettre au début de la page. Comme ceci. Alors maintenant ça devrait marcher. Donc quand j'exécute, je n'ai plus aucun message d'erreur, c'est-à-dire que ma session a bien été initialisée et par conséquent la variable de session ma_var a été créée. Maintenant je vais aller sur la page2.php et je vais faire le même traitement. Donc d'ailleurs je vais copier ce code et Et maintenant je vais essayer d'afficher la variable ma_var. Comme ceci. Maintenant je vais tester mon code. Alors je suis sur la page 1. Quand j'actualise maintenant la variable de session est créée. Et quand je me rends sur la page 2 et que j'actualise, ça m'affiche bien session de test. C'est-à-dire que la variable que j'ai créée dans la page 1 est est aussi accessible dans la page 2 et c'est généralement le cas pour toutes les pages de mon site ou mon projet web. Alors, pour manipuler les variables de session il faut toujours déclarer la fonction session_start au tout début du document, ça veut dire avant d'envoyer quoi que ce soit au navigateur. Afin de manipuler la variable elle-même on fait appel à la variable superglobale $_SESSION et vous mettez entre les guillemets le nom de la variable souhaitée. Bien sûr vous pouvez créer autant de variables de session que vous souhaitez. Et si vous voulez les écraser d'un seul coup, on fait appel à la fonction session_destroy comme ceci. Donc maintenant quand j'exécute la page 2, je vais récupérer la variable de session. Ensuite je vais écraser la session, ça veut dire que je vais supprimer toutes les variables de session qui ont été créées. C'est-à-dire que quand je vais recharger la page 2, dans ce cas les variables de session seront systématiquement supprimées et du coup il pourra rien afficher dans ce cas. Alors regardons maintenant ce qui va se passer. Bon quand j'actualise, il me donne undefined index my_var. Ça veut dire que cette variable n'a pas été trouvée. Alors en général, pour manipuler les sessions, vous avez les 2 fonctions session_start et session_destroy que vous pouvez déclarer, et ensuite la variable de session elle-même. Les variables de session sont pratiques quand vous voulez mémoriser une variable tout au long de la session de l'utilisateur, comme c'est le cas par exemple d'un panier sur un site e-commerce, d'une valeur spéciale que vous voulez pas perdre de vue, ou dans le cas d'authentification par exemple, afin de s'assurer si l'utilisateur a bien été authentifié ou non. Notez aussi que les variables de session ont une relation étroite avec les cookies. En réalité, la variable de session est une variable PHP, ça veut dire qu'elle est créée sur le serveur, mais celui-ci renvoie au navigateur l'identifiant de la création de cette variable en tant que cookie. Alors tant que le cookie est maintenu sur le navigateur, celui-ci peut retrouver la variable de session. Et si vous supprimez les cookies, en effaçant par exemple l'historique de navigation, alors dans ce cas c'est comme si vous avez implicitement écrasé la variable de session. Et du coup, le lien entre la session qui est créée sur le serveur et le navigateur du client est systématiquement rompu. Maintenant, on va voir un exemple pratique, c'est celui de l'authentification du client. Alors, on aura plus besoin de ces 2 pages, page1 et page2, mais j'aurais plutôt besoin des 2 pages login.php et session.php que j'ai déjà préparées au préalable. login.php contient juste un formulaire d'authentification qui contient une zone de texte, une zone de mot de passe et un bouton Valider. Bien sûr, je vais récupérer les valeurs du login et du mot de passe à l'aide de $POST et je vais afficher le message d'erreur éventuel dans cette partie, comme par exemple si le login et le mot de passe ne collent pas. Dans la page session, j'ai rien de spécial, c'est juste une page où j'ai écrit page confidentielle, ça veut dire que c'est une page qui n'est accessible que par la personne qui est authentifiée via la page login.php, avec un lien de déconnexion qui va rediriger le navigateur vers la page déconnexion.php que j'ai pas encore créée et un petit message de félicitations. En gros, ça va ressembler à ceci. Bon, je vais retirer ces deux pages. Donc là, c'est la page login.php qui contient les inputs d'authentification et la page session.php. L'objectif, c'est que cette page, ça veut dire session.php, doit être confidentielle et inaccessible au public. Alors, seules les personnes qui sont authentifiées correctement via la page login.php peuvent y accéder. Donc maintenant, on va se rendre dans le code. Surtout dans la page login.php et on va faire le traitement suivant. On imagine qu'ici on aura besoin des variables de session, donc on va déclarer ici session_start comme ceci. Maintenant, on va vérifier si l'utilisateur a cliqué sur le bouton submit. On mettra donc if isset. Le traitement à faire est une authentification statique, c'est-à-dire que le login et le mot de passe sont enregistrés dans le code source de la page login.php. C'est une technique qui n'est pas très appréciée, mais pour le moment c'est une solution provisoire afin de mieux comprendre les sessions. On mettra donc le code suivant, c'est-à-dire on va vérifier si le login correspond à user et le mot de passe correspond à 123. Dans ce cas, ce qu'on va faire, c'est initialiser une variable de session de notre choix qui va indiquer à la page session.php que l'utilisateur est bien autorisé à y accéder. On mettra donc ici session, par exemple autorisé égal à oui. C'est-à-dire qu'il suffit de vérifier si la variable session autorisé correspond à oui, ça veut tout simplement dire que l'utilisateur s'est bien authentifié correctement. Et ensuite on va rediriger le navigateur vers la page session.php à l'aide de la fonction header. Comme ceci. Donc la fonction header aussi est une fonction qui renvoie des en-têtes HTTP, donc il faut faire en sorte de la déclarer avant d'écrire quoi que ce soit sur le navigateur. Else, c'est-à-dire que si le login ou le mot de passe ne correspondent pas aux valeurs attendues, on va donc afficher un message d'erreur. On mettra par exemple error égal Mauvais login ou mot de passe. Après avoir fait ceci, maintenant on va se rendre dans la page session. Donc même chose, c'est une page qui est confidentielle, c'est-à-dire que pas tout le monde peut y accéder. On va donc vérifier si cette variable, c'est-à-dire la variable session autorisée, correspond bien à oui afin de permettre à l'utilisateur de voir son contenu. On mettra donc là un code PHP. Comme d'habitude, session_start. Et là, on va vérifier la valeur de la variable de session autorisé. On va plutôt mettre est différent de oui, ça veut dire que si la valeur n'est pas celle attendue, alors systématiquement on va rediriger le navigateur vers la page d'authentification. On mettra donc header login.php. Et de préférence, on va mettre ici un truc du genre exit, c'est-à-dire que c'est un arrêt prématuré. Bon, bien sûr, la redirection sera effectuée avant, mais en guise de précaution, vaut mieux aussi prévoir un arrêt prématuré à cet endroit au cas où. Alors, exécutons maintenant. On va d'abord se rendre sur la page session.php. Notez bien que cette page n'est accessible que par les personnes qui se sont authentifiées correctement. Alors, quand je vais actualiser, Vous avez remarqué qu'il y a une notification parce que la variable autorisé n'est pas reconnue. Bon, c'est simple, on va tout simplement faire ici l'arobase pour échapper à l'erreur provisoirement. Bon, maintenant quand j'exécute, regardez, j'ai pas pu accéder à la page session. Je recommence pour voir. Voilà, quand je mets Entrée, je me redirige automatiquement vers la page login.php. Ici, je dois fournir le login et le mot de passe qui sont spécifiés, par exemple user et Imaginez que j'ai mis n'importe quoi pour le mot de passe, ça veut dire que c'est pas correct. J'aurais dû commettre une erreur quelque part. Je vais retourner dans le code pour voir. Login, voilà c'est ici, donc double égal parce que c'est un test. Bon maintenant je reviens vers la page login et je mets par exemple n'importe quoi et ça m'affiche mauvais login ou mot de passe. Mais si je mets user avec le mot de passe 123, maintenant ça accède bel et bien à la page session.php. Bon maintenant on va se déconnecter. Bon quand je clique sur déconnexion, je vais me rendre sur une page qui s'appelle déconnexion.php que j'ai pas encore créée. Voilà son chemin. Alors le rôle de cette page, c'est d'écraser toutes les variables de session qui ont été créées. Bon, je vais donc mettre ici un nouveau document que je vais enregistrer sous le nom de déconnexion.php. Et dedans, je vais mettre le code suivant: session_start pour reprendre la session déjà ouverte, session_destroy pour écraser les variables de session qui ont été déclarées. Et finalement une redirection vers la page login. Vous avez remarqué qu'il n'y a aucune trace du HTML dans cette page, il n'y a même pas aucun message qui a été affiché. En général, on appelle cette page une page tunnel, c'est-à-dire que c'est une page qui n'est pas vraiment visible sur le navigateur, mais il a juste un rôle en background, c'est-à-dire qu'il va juste écraser les variables de session et faire une redirection d'une manière inaperçue. Ça veut dire que l'utilisateur va même pas se rendre compte de la présence de cette page sur le serveur. Donc maintenant, exécutons le code pour voir le résultat. Bon, j'actualise. Quand je clique sur Déconnexion, voilà, donc maintenant la session est écrasée et je me suis redirigé automatiquement vers la page login.php. Je vais encore tenter d'accéder à la page session. Et voilà, donc ça me laisse pas passer. Alors il faut impérativement s'authentifier afin de pouvoir y accéder. Juste une remarque, bon, si on se rend sur la page login.php, on va voir que le mot de passe est affiché ici en clair. Bon, comme j'ai dit tout à l'heure, c'est juste un exemple de test, ça veut dire c'est pas comme ça qu'on fait réellement. Normalement, l'authentification se fait soit via base de données ou bien via des fichiers qui sont bien sécurisés, etc. Mais au moins, il faut pas afficher ou bien il faut pas divulguer le mot de passe de cette manière. Alors on va essayer de le hacher avec un algorithme de hachage. On va par exemple opter pour le MD5. Ça veut dire je vais hacher le code 123 en MD5. Pour récupérer le hash code, je vais faire ceci: echo md5. J'exécute et ça me donne ce code. En fait, un message MD5 est codé sur 16 octets, à savoir 32 caractères en hexadécimal. Donc maintenant, je vais juste copier ça. Donc ça, ça correspond à 123 mais qui est hashé en MD5. Maintenant, ce que je vais faire, c'est— bon, je vais écarter ça— je vais mettre le code ici et au lieu de vérifier le mot de passe directement, je vais vérifier le MD5 du mot de passe. En réalité, le hachage c'est pas du chiffrement. Le chiffrement c'est qu'on peut crypter un message et on peut le décrypter ensuite, bien sûr si on dispose des moyens nécessaires pour le faire. Mais pour le hachage, il est unidirectionnel, c'est-à-dire que je peux crypter mais je peux pas décrypter. Et puisque je peux pas décrypter le message, alors comment je saurai que c'est bien 123 qui a été fourni? C'est impossible. Alors ce qu'il faut faire, c'est que je vais encore hacher l'entrée de l'utilisateur avec le même algorithme et je vais vérifier donc si le hashcode résultant correspond au hashcode qui a été sauvegardé sur le serveur. Pour moi, ce qui m'intéresse, c'est pas de connaître le mot de passe, mais juste de savoir si l'utilisateur a bien saisi le bon mot de passe. Donc maintenant, j'exécute pour voir le résultat. Donc je mets user, si je mets n'importe quoi, il n'accepte pas. Si je mets 123, donc maintenant ça s'authentifie correctement. En se contentant de ça pour cette séance, merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









