Les méthodes de cryptage en PHP

Les méthodes de cryptage en PHP

  1. Objectifs

    • Connaitre les méthodes de cryptage des mots de passe
  2. Présentation

    • Il en existe beaucoup de méthode de cryptage. Cela peut aller des algorithmes de cryptage (pouvant être décryptés avec l’algorithme et la clé adéquate) aux algorithmes de hashage. Ce sont plutôt ces derniers que l’on a tendance à utiliser aujourd’hui.
    • Dans le cas général, le cryptage utilise une clé. C’est une suite de lettres (ou une phrase) qui est connue des deux parties.
    • Une fois que le pirate a obtenu l’accès direct à votre base de données (en contournant le serveur web), les données sensibles, stockées dans votre base sont accessibles directement, à moins que les données de la base ne soient protégées par la base. Chiffrer les données est une bonne solution pour réduire cette menace, mais très peu de bases de données offrent ce type de chiffrement.
    • Il existe de nombreuses fonctions Php qui permettent de générer un algorithme permettant ainsi de crypter un mot de passe. Cependant, ces fonctions ont fini par devenir obsolètes avec le temps car leurs chiffrements ont fini par être découverts ! C’est le lot de toutes protections informatiques telles quelle soit !
    • Les méthodes de cryptage en PHP

    • Parmi ces fonctions, nous avons :
      • crypt(): Hachage à sens unique (indéchiffrable)
      • password_hash():Crée une table de hachage pour un mot de passe
      • sha1():Calcule le sha1 d’une chaîne de caractères
      • md5(): Calcule le md5 d’une chaîne
    • L’utilisation de bcrypt,qui est une fonction de hachage, reste la meilleure pratique actuellement acceptée pour le hachage des mots de passe, mais un grand nombre de développeurs utilisent encore des algorithmes plus anciens et plus faibles comme MD5 et SHA1.
    • Certains développeurs n’utilisent même pas de sel lors du hachage. La nouvelle API de hachage de PHP 5.5 vise à attirer l’attention sur bcrypt tout en cachant sa complexité.
    • La nouvelle API de hachage de mot de passe expose quatre fonctions simples:
      1. password_hash() – utilisé pour hacher le mot de passe.
      2. password_verify() – utilisé pour vérifier un mot de passe par rapport à son hachage.
      3. password_needs_rehash() – utilisé lorsqu’un mot de passe doit être modifié.
      4. password_get_info() – renvoie le nom de l’algorithme de hachage et diverses options utilisées lors du hachage.



  3. Les fonctions traditionnelles de hachage md5() et sha1()

    • La fonction MD5
      • La fonction md5() est une fonction intégrée en PHP qui est utilisée pour calculer le hachage MD5 d’une chaîne.
      • La fonction md5() utilise l’algorithme MD5 Message-Digest de RSA Data Security, Inc. Pour calculer le hachage MD5 d’un fichier, utilisez la fonction md5_file().
      • Exemple de hash avec md5()

        • Code

          <!DOCTYPE html>
          <html>
          <body>
              <?php
                     $str = "apcpedagogie";
                     echo md5($str);
               ?>
          </body>
          </html>
          Production

          Les méthodes de cryptage en PHP

        • La variable $md5 contient alors une chaîne unique, composée de caractères hexadécimaux et d’une longueur de 32 caractères. soit: 2ffe56d7a0a4aba0823e7fa38c4b8a12

        Il n’est pas recommandé d’utiliser cette fonction pour sécuriser les mots de passe, en raison de la nature rapide de cet algorithme de hachage.

    • La fonction SHA1
      • Syntaxe

        • sha1 ( string $str [, bool $raw_output = FALSE ] ) : string
      • Liste de paramètres

        • str: La chaîne d’entrée.
        • raw_output: Si le paramètre optionnel raw_output est passé à TRUE, le sha1 est retourné sous forme binaire brute avec une taille de 20 caractères, sinon, il est retourné sous la forme d’un nombre hexadécimal d’une taille de 40 caractères.
      • Exemple de hash avec sha1()

        • Code

          <?php
            $sha1 = sha1('apcpedagogie');
            echo $sha1;
          ?>
          Production

          Les méthodes de cryptage en PHP

        • La variable $sha1 contient ici une chaîne unique, composée de caractères hexadécimaux et d’une longueur de 40 caractères.
      • Il n’est pas recommandé d’utiliser cette fonction pour sécuriser les mots de passe, en raison de la nature rapide de cet algorithme de hachage.
    • Pourquoi les fonctions traditionnelles de hachage comme md5() et sha1() sont-elles inappropriées aux mots de passe ?
      • Les algorithmes de hachage comme MD5, SHA1 et SHA256 sont destinés à être rapides et efficaces. Avec les équipements informatiques modernes, il est devenu facile d’attaquer par force brute la sortie de ces algorithmes pour retrouver la chaîne originale.
      • C’est la raison pour laquelle de nombreux experts en sécurité considèrent ces algorithmes comme faibles et les déconseillent fortement pour hacher un mot de passe utilisateur.
  4. Les nouvelles fonctions de hachage

    • La nouvelle API de hachage de mot de passe expose quatre fonctions simples:
      • password_hash() – utilisé pour hacher le mot de passe.
      • password_verify() – utilisé pour vérifier un mot de passe par rapport à son hachage.
      • password_needs_rehash() – utilisé lorsqu’un mot de passe doit être retravaillé.
      • password_get_info() – renvoie le nom de l’algorithme de hachage et diverses options utilisées lors du hachage.
    • password_hash()
      • Présentation

        • La fonction password_hash() crypte dynamiquement une information et c’est la fonction recommandé pour le hashage des mots de passe.
        • La fonction password_hash() crée un nouveau hachage de mot de passe de la string en utilisant l’un des algorithmes de hachage disponibles.
        • Il renvoie le hachage qui fait actuellement 60 caractères, cependant, comme de nouveaux algorithmes plus puissants seront ajoutés à PHP, la longueur du hachage peut augmenter.
        • Il est donc recommandé d’allouer 255 caractères à la colonne pouvant être utilisée pour stocker le hachage en base de données.
        • Lorsque vous devez hacher un mot de passe avec cette fonction, alimentez-le simplement dans la fonction et il renverra le hachage que vous pouvez stocker dans votre base de données.
        • $hash = password_hash($password, PASSWORD_DEFAULT);
      • Syntaxe

        • string password_hash ( string $password , integer $algo [, array $options ] )
      • Liste de paramètres

        • password: Le mot de passe utilisateur.
        • algo: Une constantes de l’algorithme de mot de passe représentant l’algorithme à utiliser lors du hachage du mot de passe.
        • options:Un tableau associatif contenant les options. Voir aussi les constantes de l’algorithme de mot de passe pour une documentation sur les options supportées pour chaque algorithme.
        • Si omis, un salt aléatoire sera créé et le cost par défaut sera utilisé.
      • Cette fonction reçoit toujours deux paramètres :
        • la chaîne de caractère : dans notre cas, il s’agit du mot de passe
        • l’option de hashage : nous avons trois options de hashage :
          • PASSWORD_DEFAULT :Si vous utilisez PASSWORD_DEFAULT dans vos projets, assurez-vous de stocker le hachage dans une colonne dont la capacité dépasse 60 caractères. l’option que je vous conseille d’utiliser
          • PASSWORD_BCRYPT:
          • PASSWORD_ARGON2I :
          • PASSWORD_ARGON2ID :
      • Exemple

      • Code

        
        <!DOCTYPE html>
        <html>
        <body>
        		<?php
        		// Le mot de passe en clair à hacher
        		$password = "apcpedagogie";
        		
        		// Le hachage du mot de passe qui
        		// peut être stocké dans la base de données
        		$hash = password_hash($password, 
        				PASSWORD_DEFAULT);
        		// Afficher le hash généré
        		echo "Hachage généré: ".$hash;
        		?>
        </body>
        </html>
        
        Production

        Les méthodes de cryptage en PHP

    • password_verify ()
      • Présentation

        • La fonction password_verify() vérifie que le hachage donné correspond au mot de passe donné, généré par la fonction password_hash() . Elle renvoie true si le mot de passe et le hachage correspondent, ou false dans le cas contraire.
        • Vérifie que le hachage fourni correspond bien au mot de passe fourni.
        • La fonction password_verify() prend un mot de passe ordinaire et la chaîne hachée comme ses deux arguments. Il retourne vrai si le hachage correspond au mot de passe spécifié.
        • <?php
          if (password_verify($password, $hash)) {
              // Success!
          }
          else {
              // Invalid credentials
          }
      • Syntaxe

        •  password_verify ( string $password , string $hash ) : bool
    • password_needs_rehash ()
      • Vérifie que le hachage fourni est conforme à l’algorithme et aux options spécifiées
    • password_get_info ()
      • password_get_info() accepte un hachage et renvoie un tableau associatif de trois éléments:
        • algo – une constante qui identifie un algorithme particulier
        • algoName – le nom de l’algorithme utilisé
        • options – diverses options utilisées lors de la génération du hachage
  5. Application

    • Enoncé

      • On vous demande de créer les pages suivantes:
        • connexion.php: qui contient la chaîne de connexion.
        • fonctions.php: qui contient les fonctions utilisées dans l’application.
        • inscription.php: qui permet à l’utilisateur de créer un compte. Cette page contient un formulaire avec les champs: nom, prenom, email, mot de passe, confirmation de mot de passe et un bouton d’envoi.
        • login.php: qui authentifie l’utilisateur. Elle contient un formulaire renfermant une zone de texte pour saisir l’émail, une zone de mot de passe et un bouton d’envoi.
        • accueil.php: Cette page est accessible à tous, elle contient :
          • une barre de navigation,
          • Un bouton login dans la partie droit de la barre de navigation et redirige vers la page login.php.
          • Un bouton Créer un compte dans la partie droit de la barre de navigation et redirige vers la page inscription.php.
          • Une alerte bleue invite l’utilisateur à créer un compte s’il n’en a pas encore.
          • Les méthodes de cryptage en PHP

        • session.php:
          • Représente la page à accès limité. Aucun visiteur n’a le droit de voir son contenu s’il n a pas été authentifié par la page login.php.
          • Lorsque l’utilisateur est connecté, sa session est sauvegardée dans le cache de son navigateur, et son nom d’utilisateur s’affiche dans la barre de navigation. Les boutons Créer un compte et Login disparaissent au profit du bouton Logout qui permet à l’utilisateur de se déconnecter.
        • mot-de-passe-oublie.php:
          • Représente la page de récupération de mot de passe .
          • Cette page doit contenir le code qui permet de réinitialiser le mot de passe d’un utilisateur lors de la soumission du formulaire grâce à l’envoie d’un e-mail contenant le mot de passe généré en PHP.
        • reinitialisation-mot-de-passe.php:
        • Lors de l’inscription, aucun champ ne doit être laissé vide et les champs “mot de passe” et “confirmation de mot de passe” doivent être identiques.
        • Le mot de passe doit contenir du majuscule, du minuscule et de chiffre avec un minimum de 8 caractères
        • Si tous les champs sont valides, on vérifie d’abord si l’émail n’existe pas déjà dans la base de donnée. Si non alors les informations de l’utilisateur seront placées dans la table “utilisateurs” avec hashage des mots de passe
        • La structure de la table utilisateur
          • CREATE TABLE `utilisateurs` (
               `cdeusers` int(11) unsigned NOT NULL auto_increment,
               `nom` varchar(40) NOT NULL,
               `prenom` varchar(40) NOT NULL,
               `email` varchar(40) NOT NULL,
               `password` varchar(255) NOT NULL,
               `dateChangement` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
               PRIMARY KEY (`cdeusers`)
            );
      • Réaliser un système de récupération de mot de passe en PHP.
        • Dans cette étape il va falloir ajouter deux champs a la table utilisateurs:
        • date_recuperation_mot_passe timestamp NULL
          token_recuperation_mot_passe VARCHAR(255) NULL
        • Ensuite il faudra créer un formulaire où l’utilisateur devra soumettre son adresse email. Une fois le formulaire envoyé, il faudra :
          • Vérifier que l’adresse email entrée existe dans la base de données ;
          • Insérer la date de la demande dans le champ nouvellement crée (date_recuperation_mot_passe);
          • Générer une chaîne de caractères uniques et aléatoire (token). Cette chaîne devra être sauvegardé dans la base de données, dans le champ créé précédemment (token_recuperation_mot_passe)
          • Un email devra être envoyé avec un lien vers une nouvelle page. Ce lien devra contenir en paramètre le token créé au point précédent.
        • Une nouvelle page devra être créé pour redéfinir le mot de passe. C’est le lien vers cette page qui devra Être envoyé dans l’émail à l’utilisateur.
        • Pour accéder à cette page, il faudra absolument qu’il y est en paramètre un token
          • On vérifiera dans la base de donnés si le token passé en paramètre existe dans la base de données.
          • il faudra rediriger l’utilisateur si le token n’existe pas vers la page login.php;
          • Il faudra aussi comparer les dates. Si la date inscrite dans la base de données (dans le nouveau champ) et la date d’aujourd’hui ont un décalage de plus de 15 minutes, il faudra inviter l’utilisateur à refaire le processus du début. On veut ainsi éviter qu’une demande de réinitialisation de mot de passe puisse trainer éternellement et ainsi, ouvrir une brèche de sécurité;
          • Un formulaire de réinitialisation de mot de passe sera affiché. L’utilisateur pourra entrer un nouveau mot de passe;
          • Lorsqu’il soumettra le formulaire, il faudra modifier le mot de passe du compte par celui indiqué par l’utilisateur. Pour ce faire, on peut aller chercher le compte membre associé au token fourni en paramètre.
          • Une fois le processus de changement de mot de passe complété, il ne faut pas oublier de supprimer le token de la base de données, par soucis de sécurité.
    • Solution

      • Page: inscription.php

        • Voir la solution
            <?php 
            include('connexion.php');
            if(isset($_POST['btnSubmit'])){
                $userName = (isset($_POST['user-name'])) ? $_POST['user-name'] : null;
                $userSurName = (isset($_POST['user-surname'])) ? $_POST['user-surname'] : null;
                $userEmail = (isset($_POST['user-email'])) ? $_POST['user-email'] : null;
                $userPassword = (isset($_POST['user-password'])) ? $_POST['user-password'] : null;
                $userRepeatPassword = (isset($_POST['user-repeatpassword'])) ? $_POST['user-repeatpassword'] : null;
                if(!empty($userName)&&!empty($userSurName)&&!empty($userEmail)&&!empty($userPassword)&&!empty($userRepeatPassword)){
                    if($userPassword===$userRepeatPassword){
                        //Rechercher l'existance d'email dans la table           
                        $stmt = $pdo->prepare("SELECT * FROM utilisateurs WHERE emailUtilisateur=?");
                        $stmt->execute([$userEmail]); 
                        $user = $stmt->fetch();
                        echo 'ggg  '.$user;
                        if (!$user) {
                            //hasher le mot de passe
                            $userPasswordHash = password_hash( $userPassword, PASSWORD_DEFAULT);
                            echo $userPasswordHash;
                            try {
                            
                                $sql = "INSERT INTO utilisateurs (nomUtilisateur, prenomUtilisateur,emailUtilisateur,passwordUtilisateur )
                                VALUES (?,?, ?, ?)";
                                $stmt=$pdo->prepare($sql);   
                                $exec = $stmt->execute(array($userName,$userSurName,$userEmail,$userPasswordHash));
                            
                                echo '<script type="text/javascript">alert("Données enregistrées avec succès"); </script>';  
                            } catch(PDOException $e) {
                            echo $e->getMessage();
                            }
                          
                        }else{echo '<script type="text/javascript">alert("L\'email existe déjà"); </script>';}
            
            
            
            
                    }else{echo '<script type="text/javascript">alert("Mot de passes différents"); </script>';}
            
                }else{echo '<script type="text/javascript">alert("Remplir tous les champs"); </script>';}
                
            }
            /*
            
            try {
                $sql = "INSERT INTO apprenants 
                (cinapprenant, prenom, nom, datenaissance, 
                civilite, adresse, adressmail, cdegouvernorat, 
                cdegroupe, pwd, cdeuser) VALUES (?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
                  $stmt=$pdo-> prepare($sql);   
                  $exec = $stmt->execute(array($_POST['txtCIN'], $_POST['txtPrenom'], $_POST['txtNom'], $_POST['dteNaissance'], 
                  $_POST['rdbCivilite'], $_POST['txtAdresse'], $_POST['txtAdresseMail'], $_POST['lstGouvernorat'],
                   $_POST['lstGroupe'], $_POST['txtpwd'], $_POST['txtUser'])); 
                    echo $_POST['txtCIN'];
                    echo $_POST['rdbCivilite'];
                    echo $_POST['lstGouvernorat'];
                    echo $_POST['lstGroupe'];
                  
                  echo '<script type="text/javascript">alert("Données enregistrées avec succès"); </script>';
                } catch(PDOException $e) {
                  echo $e->getMessage();
                  
              }
              
            }*/
            //Sélection des gouvernorats
            $gouv = "select cdegouvernorat,intituleFr from gouvernorats";
            $stmt = $pdo->prepare($gouv);
            $stmt->execute();
            $gouvListe = $stmt->fetchall();
            //Sélection des groupes
            $group = "select cdegroupe,intitulegr from groupes";
            $stmt = $pdo->prepare($group);
            $stmt->execute();
            $groupListe = $stmt->fetchall();
            ?>
            
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport" content="width=device-width, initial-scale=1.0">
                <meta http-equiv="X-UA-Compatible" content="ie=edge">
                <title>Sign Up Form by Colorlib</title>
            
                <!-- Font Icon -->
                <link rel="stylesheet" href="fonts/material-icon/css/material-design-iconic-font.min.css">
            
                <!-- Main css -->
                <link rel="stylesheet" href="css/style.css">
            </head>
            <body>
            
                <div class="main">
            
                    <section class="signup">
                        <!-- <img src="images/signup-bg.jpg" alt=""> -->
                        <div class="container">
                            <div class="signup-content">
                                <form method="POST" id="signup-form" class="signup-form">
                                    <h2 class="form-title">Créer un compte </h2>
                                    <div class="form-group">
                                        <input type="text" class="form-input" name="user-name" id="name" placeholder="Votre nom"/>
                                    </div>
                                    <div class="form-group">
                                        <input type="text" class="form-input" name="user-surname" id="surname" placeholder="Votre prénom"/>
                                    </div>
                                    <div class="form-group">
                                        <input type="email" class="form-input" name="user-email" id="email" placeholder="Votr Email"/>
                                    </div>
                                    <div class="form-group">
                                        <input type="text" class="form-input" name="user-password" id="password" placeholder="Votre Password"/>
                                        <span toggle="#password" class="zmdi zmdi-eye field-icon toggle-password"></span>
                                    </div>
                                    <div class="form-group">
                                        <input type="password" class="form-input" name="user-repeatpassword" id="re_password" placeholder="Répétez votre mot de passe"/>
                                    </div>
                                    <div class="form-group">
                                        <input type="checkbox" name="agree-term" id="agree-term" class="agree-term" />
                                        <label for="agree-term" class="label-agree-term"><span><span></span></span>Je suis d'accord avec toutes les déclarations.<a href="#" class="term-service"> Conditions d'utilisation</a></label>
                                    </div>
                                    <div class="form-group">
                                        <input type="submit" name="btnSubmit" id="submit" class="form-submit" value="S'inscrire"/>
                                    </div>
                                </form>
                                <p class="loginhere">
                                    Vous avez déjà un compte ? <a href="#" class="loginhere-link">Connectez-vous</a>
                                </p>
                            </div>
                        </div>
                    </section>
            
                </div>
            
                <!-- JS -->
                <script src="vendor/jquery/jquery.min.js"></script>
                <script src="js/main.js"></script>
            </body><!-- This templates was made by Colorlib (https://colorlib.com) -->
            </html>
      • Page: fonctions.php

        • Voir la solution
          
          function check_mdp_format($mdp)
          {
          	$majuscule = preg_match('@[A-Z]@', $mdp);
          	$minuscule = preg_match('@[a-z]@', $mdp);
          	$chiffre = preg_match('@[0-9]@', $mdp);
          	
          	if(!$majuscule || !$minuscule || !$chiffre || strlen($mdp) < 8)
          	{
          		return false;
          	}
          	else 
          		return true;
          }
          function chercher_email($mail,$champs){
              include('connexion.php');
              $stmt = $pdo->prepare("SELECT * FROM utilisateurs WHERE ".$champs."=?");
              $stmt->execute([$mail]); 
              $user = $stmt->fetch();
              //echo 'ggg  '.$user;
              if ($user) {
                  return true;
              }else{
          		return false;
              }
          }
          function chercher_passward($passward,$userEmail, $champs){
              include('connexion.php');
              $stmt = $pdo->prepare("SELECT nomUtilisateur,prenomUtilisateur,passwordUtilisateur FROM utilisateurs WHERE ".$champs."=?");
              $stmt->execute([$userEmail]); 
              $hash = $stmt->fetch();   
              if (password_verify($passward, $hash[2])) {
          $_SESSION['utilisateur']=$hash[0]." ".$hash[1];
                  return true;
              }else{
          		return false;
              }
          }
          
      • Page: login.php

        • Voir la solution
          
          <?php
          session_start();
          include('connexion.php');
          include('fonctions.php');
          if(isset($_POST['btnSubmit'])){
              $userEmail = (isset($_POST['user-email'])) ? $_POST['user-email'] : null;
              $userPassword = (isset($_POST['user-password'])) ? $_POST['user-password'] : null;
          
              if(!empty($userEmail)&&!empty($userPassword)){
                  if (chercher_email($userEmail,'emailUtilisateur')===true) {
                      if (chercher_passward($userPassword, $userEmail,'emailUtilisateur')===true) {
                          //echo $_SESSION['utilisateur'];
                          header("Location: session.php");               
                      }else{echo '<script type="text/javascript">alert("Le mot de passe est invalide."); </script>';}
                  }else{echo '<script type="text/javascript">alert("L\'email n\'existe pas"); </script>';}
              }
          }
          ?>
          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Sign Up Form by Colorlib</title>
          
              <!-- Font Icon -->
              <link rel="stylesheet" href="fonts/material-icon/css/material-design-iconic-font.min.css">
          
              <!-- Main css -->
              <link rel="stylesheet" href="css/style.css">
          </head>
          <body>
              <div class="main">
                  <section class="signup">
                      <!-- <img src="images/signup-bg.jpg" alt=""> -->
                      <div class="container">
                          <div class="signup-content">
                              <form method="POST" id="signup-form" class="signup-form">
                                  <h2 class="form-title">Se connecter</h2>                      
                                  <div class="form-group">
                                      <input type="email" class="form-input" name="user-email" id="email" placeholder="Votr Email"/>
                                  </div>
                                  <div class="form-group">
                                      <input type="text" class="form-input" name="user-password" id="password" placeholder="Votre Password"/>
                                      <span toggle="#password" class="zmdi zmdi-eye field-icon toggle-password"></span>
                                  </div>            
                                  <div class="form-group">
                                      <input type="submit" name="btnSubmit" id="submit" class="form-submit" value="Se connecter"/>
                                  </div>
                              </form>
                              <p class="loginhere">
                                  Vous avez oublié ? <a href="#" class="loginhere-link">Mot de passe</a>
                              </p>
                          </div>
                      </div>
                  </section>
              </div>
              <!-- JS -->
              <script src="vendor/jquery/jquery.min.js"></script>
              <script src="js/main.js"></script>
          </body><!-- This templates was made by Colorlib (https://colorlib.com) -->
          </html>
          
          
      • Page: session.php

        • Voir la solution
          
          <?php
          session_start();
          include('connexion.php');
          include('fonctions.php');
          if(!isset($_SESSION['utilisateur']))  
           {
                  session_destroy();
                  //rediriger l'utilisateur vers la page d'accueil
                  header("Location: login.php");
                  // On n'affiche plus rien
                  exit; 
           }
          ?>
          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Sign Up Form by Colorlib</title>
          
              <!-- Font Icon 
              <link rel="stylesheet" href="fonts/material-icon/css/material-design-iconic-font.min.css">-->
              <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
          
              <!-- Main css 
              <link rel="stylesheet" href="css/style.css">-->
          <body>
              <!-- Navbar -->
              <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <div class="container-fluid">
              <a class="navbar-brand" href="#">Navbar</a>
              <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
              </button>
              <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                  <li class="nav-item">
                    <a class="nav-link active" aria-current="page" href="#">Home</a>
                  </li>
                  <li class="nav-item">
                    <a class="nav-link" href="#">Link</a>
                  </li>
                  <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                      Dropdown
                    </a>
                    <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
                      <li><a class="dropdown-item" href="#">Action</a></li>
                      <li><a class="dropdown-item" href="#">Another action</a></li>
                      <li><hr class="dropdown-divider"></li>
                      <li><a class="dropdown-item" href="#">Something else here</a></li>
                    </ul>
                  </li>
                  <li class="nav-item">
                    <a class="nav-link disabled">Disabled</a>
                  </li>
                </ul>
                <div class="d-flex">
                <p>Bienvenue :    
                <?php echo $_SESSION['utilisateur'];?></p><a href='accueil.php'>  Déconnection</a>
              </div>
              </div>
            </div>
          </nav>
          </head><h1>Bienvenue <?php echo $_SESSION['utilisateur'];?></h1>
          
              <!-- JS 
              <script src="vendor/jquery/jquery.min.js"></script>
              <script src="js/main.js"></script>-->
              <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
          
          </body><!-- This templates was made by Colorlib (https://colorlib.com) -->
          </html>
          
      • Page: accueil.php

        • Voir la solution
          
          <?php
          session_start();
          include('connexion.php');
          include('fonctions.php');
          //session_start();
          session_destroy();
          ?>
          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Sign Up Form by Colorlib</title>
          
              <!-- Font Icon 
              <link rel="stylesheet" href="fonts/material-icon/css/material-design-iconic-font.min.css">-->
              <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
          
              <!-- Main css 
              <link rel="stylesheet" href="css/style.css">-->
          <body>
              <!-- Navbar -->
              <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <div class="container-fluid">
              <a class="navbar-brand" href="#">Navbar</a>
              <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
              </button>
              <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                  <li class="nav-item">
                    <a class="nav-link active" aria-current="page" href="#">Home</a>
                  </li>
                  <li class="nav-item">
                    <a class="nav-link" href="#">Link</a>
                  </li>
                  <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                      Dropdown
                    </a>
                    <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
                      <li><a class="dropdown-item" href="#">Action</a></li>
                      <li><a class="dropdown-item" href="#">Another action</a></li>
                      <li><hr class="dropdown-divider"></li>
                      <li><a class="dropdown-item" href="#">Something else here</a></li>
                    </ul>
                  </li>
                  <li class="nav-item">
                    <a class="nav-link disabled">Disabled</a>
                  </li>
                </ul>
                <div class="d-flex">
                <div class="btn-group">
            <a href="inscription.php" class="btn btn-warning">Créer un compte </a>
            <a href="login.php" class="btn btn-success">Se connecter</a>
          </div>  
              </div>
              </div>
            </div>
          </nav>
          <div class="d-flex justify-content-center">
          <div class="alert alert-primary w-30 " role="alert" >
            Vous n'avez pas encore de compte ? <a href="inscription.php">Inscrivez-vous</a> maintenant!
          </div>
          </div>
              <!-- JS 
              <script src="vendor/jquery/jquery.min.js"></script>
              <script src="js/main.js"></script>-->
              <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
          
          </body><!-- This templates was made by Colorlib (https://colorlib.com) -->
          </html>
          
      • Page: mot-de-passe-oublie.php

        • Voir la solution
          <?php
          session_start();
          include('connexion.php');
          include('fonctions.php');
          if(isset($_POST['btnSubmit'])){
          
              $userEmail = (isset($_POST['user-email'])) ? $_POST['user-email'] : null;
              if(!empty($userEmail)){
                  if (chercher_email($userEmail,'emailUtilisateur')===true) {
                      //On génère un token
                      $string=implode('',array_merge(range('A','Z'),range('a','z'),range('0','9')));
                      $token = substr(str_shuffle($string),0,20);
                      //On insère la date et le token dans la BD
                      $stmt = $pdo->prepare('update utilisateurs set date_recuperation_mot_passe=now(),
                      token_recuperation_mot_passe=? where emailUtilisateur = ?');
                      $exec = $stmt->execute(array($token,$userEmail));
                      //On prépare l'envoie du courrier
                      $link='chemin?token='.$token;
                      $to='apcpedagogie1@gmail.com';
                      $sujet='Rénitialisation de votre mot de passe';
                      $message='<h1>Rénitialisation de votre mot de passe</h1>
                      <p>Pour rénitialiser votre mot de passe, veuillez suivre ce lien : <a href="'.$link.'">'.$link.'</a></p>';
                      //On défini les entêtes requis
                      $header = [];
                      $header[]='MIME-Version: 1.0';
                      $header[]='Content-type: text/html: charset=iso-8859-1';
                      $header[]='To: '.$to.' <'.$to.'>';
                      $header[]='From: apcpedagogie1@gmail.com';
                      //On envoie le courrier
                      if(mail($to,$sujet,$message, implode("\r\n",$header))){
                      echo "Email envoyé avec succès à $to ...";
                          } else {
                              echo "Échec de l'envoi de l'email...";
                          }
                      /*$message='<div style="color:green;"> Un courrier à été acheminé.
                      Veuillez regarder votre boîte aux lettres et suivre les instructions à 
                      l\'interieur du courrier.</div>';*/
                      //echo 'gfgfgfgfg'.$to.$sujet.$message;
                      //echo '<script type="text/javascript">alert("Un courrier à été acheminé"); </script>';
                  }else{echo '<script type="text/javascript">alert("L\'email n\'existe pas"); </script>';}
              }
          }
          ?>
          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Sign Up Form by Colorlib</title>
          
              <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
          
          
              <!-- Main css -->
              <link rel="stylesheet" href="css/style.css">
          </head>
          <body>
          
              <div class="main">
          
                  <section class="signup">
                      <!-- <img src="images/signup-bg.jpg" alt=""> -->
                      <div class="container">
                          <div class="signup-content">
                              <form method="POST" id="oublie-form" class="signup-form">
                                  <h2 class="form-title">Rénitialiser votre mot de passe</h2>
                                
                                  <div class="form-group">
                                      <input type="email" class="form-input" name="user-email" id="email" placeholder="Votr Email"/>
                                  </div>
                                                   
                                  <div class="form-group">
                                      <input type="submit" name="btnSubmit" id="submit" class="form-submit" value="Envoyez-moi un mot de passe aléatoire"/>
                                  </div>
                              </form>
                              <p class="loginhere">
                                  Vous avez oublié ? <a href="login.php" class="loginhere-link">Retour</a>
                              </p>
                          </div>
                      </div>
                  </section>
          
              </div>
          
              <!-- JS -->
              <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
          
          </body>
          </html>
          
          






Abonnez vous à notre chaîne YouTube gratuitement