Les méthodes de cryptage en PHP
Sommaire
- 1- Objectifs
- 2- Présentation
- 3- Les fonctions traditionnelles de hachage md5() et sha1()
- 3.1- La fonction MD5
- 3.1.1- Exemple de hash avec
md5()
- 3.2- La fonction SHA1
- 3.2.1- Syntaxe
- 3.2.2- Liste de paramètres
- 3.2.3- Exemple de hash avec sha1()
- 3.3- Pourquoi les fonctions traditionnelles de hachage comme
md5()
etsha1()
sont-elles inappropriées aux mots de passe ? - 4- Les nouvelles fonctions de hachage
- 4.1- password_hash()
- 4.1.1- Présentation
- 4.1.2- Syntaxe
- 4.1.3- Liste de paramètres
- 4.1.4- Exemple
- 4.2- password_verify ()
- 4.2.1- Présentation
- 4.2.2- Syntaxe
- 4.3- password_needs_rehash ()
- 4.4- password_get_info ()
- 5- Application
- 5.1.1- Page: inscription.php
- 5.1.2- Page: fonctions.php
- 5.1.3- Page: login.php
- 5.1.4- Page: session.php
- 5.1.5- Page: accueil.php
- 5.1.6- Page: mot-de-passe-oublie.php
- 5.1.7- Cours PHP
Les méthodes de cryptage en PHP
-
Objectifs
- Connaitre les méthodes de cryptage des mots de passe
-
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 !
- Parmi ces fonctions, nous avons :
crypt()
: Hachage à sens unique (indéchiffrable)password_hash()
:Crée une table de hachage pour un mot de passesha1()
:Calcule le sha1 d’une chaîne de caractèresmd5()
: 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:
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 modifié.password_get_info()
– renvoie le nom de l’algorithme de hachage et diverses options utilisées lors du hachage.-
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()
- 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 - Activité
-
La fonction SHA1
-
Syntaxe
-
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()
- 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()
etsha1()
sont-elles inappropriées aux mots de passe ? - Les algorithmes de hachage comme
MD5
,SHA1
etSHA256
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.
-
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.
-
Syntaxe
-
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
-
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 fonctionpassword_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é.
-
Syntaxe
-
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 particulieralgoName
– le nom de l’algorithme utiliséoptions
– diverses options utilisées lors de la génération du hachage-
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.
- 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
- 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:
- 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
-
Page: fonctions.php
-
Page: login.php
-
Page: session.php
-
Page: accueil.php
-
Page: mot-de-passe-oublie.php
Code
<!DOCTYPE html>
<html>
<body>
<?php
$str = "apcpedagogie";
echo md5($str);
?>
</body>
</html>
Production
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.
sha1 ( string $str [, bool $raw_output = FALSE ] ) : string
Code
<?php
$sha1 = sha1('apcpedagogie');
echo $sha1;
?>
Production
$hash = password_hash($password, PASSWORD_DEFAULT);
string password_hash ( string $password , integer $algo [, array $options ] )
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
<?php
if (password_verify($password, $hash)) {
// Success!
}
else {
// Invalid credentials
}
password_verify ( string $password , string $hash ) : bool
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`)
);
date_recuperation_mot_passe timestamp NULL
token_recuperation_mot_passe VARCHAR(255) NULL
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>
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;
}
}
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>
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>
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>
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>