Stocker des mots de passe en clair dans une base de données expose vos applications PHP à des risques de sécurité élevés.
Sans cryptage, vos données sensibles sont vulnérables aux attaques, entraînant des violations de données, une perte de confiance des utilisateurs, et des conséquences légales.
Cet article détaille comment sécuriser vos applications PHP en cryptant les mots de passe avec password_hash()
et en les vérifiant avec password_verify()
, tout en manipulant les variables superglobales $_POST
pour renforcer la sécurité des données utilisateurs.
Créer une Base de Données Sécurisée en PHP 8
Pour commencer à sécuriser les mots de passe, vous devez d’abord créer une base de données et une table dédiée aux utilisateurs. Nous allons utiliser phpMyAdmin pour cette étape.
Étape 1 : Créer la base de données
Dans phpMyAdmin, créez une nouvelle base de données appelée alphorm :
- Connectez-vous à phpMyAdmin.
- Cliquez sur l’onglet Bases de données.
- Saisissez le nom de la base de données : alphorm.
- Cliquez sur Créer.
Étape 2 : Créer la table user
Une fois la base de données créée, vous allez créer une table appelée user avec les champs suivants :
- userID : Identifiant unique de l’utilisateur (clé primaire).
- login : Nom d’utilisateur, doit être unique.
- pass : Mot de passe crypté.
Procédure :
- Dans phpMyAdmin, sélectionnez la base de données alphorm.
- Cliquez sur Nouvelle table et nommez-la user.
- Ajoutez les champs suivants :
userID : type INT, cochez A_I (Auto-Increment), cochez PRIMARY (clé primaire).
login : type VARCHAR(50)
, cochez UNIQUE (unique).
pass : type VARCHAR(50)
.
- Cliquez sur Enregistrer.
Résultat final :
Créer le Formulaire d'Inscription Utilisateur en PHP 8
Dans cette section, vous allez créer un formulaire d’inscription simple qui permet aux utilisateurs de créer un compte en saisissant un nom d’utilisateur et un mot de passe. Ce formulaire sera traité par le même fichier index.php.
- Code HTML pour le formulaire d’inscription :
Voici le code que vous avez écrit pour la page d’inscription :
Créer votre Compte
Accés Compte
Ce formulaire demande aux utilisateurs de saisir un login et un password pour créer un compte.
- Résultat affiché :
Styliser le Formulaire d'Inscription en PHP 8
Pour rendre votre formulaire d’inscription visuellement attrayant et convivial, vous avez utilisé du CSS pour styliser les éléments HTML. Voici une explication détaillée du code que vous avez créé.
- Code CSS pour la mise en forme :
@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap');
body{
font-family: 'Roboto',sans-serif;
height: 100vh;
margin: 0;
background-image: url('../img/fond.jpg');
background-repeat: no-repeat;
background-size: cover;
background-attachment: fixed;
background-position: center;
display: flex;
justify-content: center;
align-items: center;
}
section{
width: 300px;
background-color: #333;
padding: 20px;
text-align: center;
}
section h1{
color:#fff;
letter-spacing: 1px;
font-size: 26px;
}
section input{
display: block;
width: 100%;
padding: 0px 15px;
box-sizing: border-box;
outline: none;
}
- Résultat affiché :
Ajouter de l'Interactivité au Formulaire d'Inscription en PHP 8
Pour améliorer l’expérience utilisateur, vous avez ajouté de nouveaux styles dans le fichier style.css qui donnent plus d’interactivité à votre formulaire d’inscription. Ces styles permettent d’ajouter des effets visuels lorsque les utilisateurs interagissent avec les champs du formulaire.
- Code CSS complet pour l’interactivité :
@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap');
body{
font-family: 'Roboto',sans-serif;
height: 100vh;
margin: 0;
background-image: url('../img/fond.jpg');
background-repeat: no-repeat;
background-size: cover;
background-attachment: fixed;
background-position: center;
display: flex;
justify-content: center;
align-items: center;
}
section{
width: 300px;
background-color: #333;
padding: 20px;
text-align: center;
}
section h1{
color:#fff;
letter-spacing: 1px;
font-size: 26px;
margin-top:60px;
}
section input{
display: block;
width: 100%;
padding: 0px 15px;
box-sizing: border-box;
border: none;
outline: none;
height : 40px;
}
section input[type="text"],section input[type="password"]{
margin: 20px 0;
border-radius: 6px;
opacity: 0.5;
transition: 0.7s;
}
section input[type="text"]:hover,section input[type="password"]:hover{
opacity: 1;
}
section input[type="submit"]{
margin-top: 40px;
margin-bottom: 20px;
border-radius: 50px;
background-color: rgb(12,151,144);
cursor: pointer;
color: #fff;
letter-spacing: 1px;
font-size: 20px;
transition: 0.7s;
}
section input[type="submit"]:hover{
transform: scale(0.95);
}
section a {
text-decoration: none;
color: #fff;
display: block;
font-size: 14px;
padding: 10px;
transition: 0.8s;
}
section a:hover{
background-color: #000;
opacity: 0.2;
}
::placeholder{
text-transform: capitalize;
}
- Résultat affiché :
Configurer le Formulaire d'Accès au Compte en PHP 8
Dans cette section, vous allez mettre en place un formulaire pour permettre aux utilisateurs d’accéder à leur compte. Vous avez créé un fichier acces.php qui gère ce formulaire, et vous avez réutilisé les styles déjà définis dans style.css pour assurer une cohérence visuelle avec le formulaire d’inscription.
- Code complet de « acces.php »
Accès à votre Compte
Créer Compte
- Résultat affiché :
Initialiser une Instance avec la Classe PDO en PHP 8
Dans cette section, vous allez créer une connexion sécurisée à la base de données en utilisant la classe PDO (PHP Data Objects). Pour cela, vous avez créé un dossier cnx qui contient un fichier cnx.php. Ce fichier sera responsable de l’établissement de la connexion à votre base de données MySQL.
- Code complet de cnx.php :
Rédiger la Requête d'Insertion en PHP 8
Dans cette étape, vous allez ajouter un code PHP pour insérer les données d’inscription dans votre base de données. Vous avez déjà créé le fichier cnx.php pour établir la connexion à la base de données. Maintenant, vous allez utiliser cette connexion pour exécuter une requête d’insertion lorsque le formulaire d’inscription est soumis.
- Code PHP pour l’insertion dans index.php :
Ajoutez le code suivant en haut de votre fichier index.php pour gérer l’insertion des données :
prepare($sql);
$req->execute(
array(
':login'=>$login,
':pass'=>$pass
)
);
}
?>
Avec ce code en place, vous êtes maintenant prêt à insérer les utilisateurs dans votre base de données. Assurez-vous de tester l’insertion avec des données exemple (comme stev_jobs avec le mot de passe 123) pour vérifier que tout fonctionne correctement.
Optimiser la Requête d'Insertion pour la Validation
Vous avez ajouté une vérification pour vous assurer que les champs du formulaire ne sont pas vides avant d’insérer les données dans la base de données. Vous avez également ajouté des messages pour informer l’utilisateur du résultat de l’opération.
- Code complet mis à jour de index.php :
prepare($sql);
$req->execute(
array(
':login'=>$login,
':pass'=>$pass
)
);
$message='Votre compte a bien été créé';
}else{
$message='Merci de remplir tous les champs';
}
}
?>
- Résultat du test :
Lorsque je clique sur le bouton de « Créer mon Compte » avec les champs login ou password vide il m’affiche ce message d’erreur :
Sinon Si les champs sont remplis par exemple avec Elon_Musk comme une login et 456 comme une password il affiche un message de succès comme :
Maîtrise Complète de PHP 8 : De l'Initiation à l'Expertise en Architecture MVC
Vérifier l'Existence du Login Utilisateur en PHP 8
Dans cette étape, vous allez ajouter une vérification pour vous assurer que le login n’existe pas déjà dans la base de données avant d’insérer un nouvel utilisateur. Vous avez introduit une requête pour vérifier la présence du login, mais quelques ajustements sont nécessaires pour que le code fonctionne correctement.
- Code PHP mis à jour de index.php :
prepare($sql2);
$req->execute(
array(
':login'=>$login
)
);
$count = $req2->rowcount();
if($count <=0){
//on insert le nouvel utilisateur
$sql='INSERT INTO user (login,pass) VALUES (:login,:pass)';
$req=$cnx->prepare($sql);
$req->execute(
array(
':login'=>$login,
':pass'=>$pass
)
);
$message='Votre compte a bien été créé';
} else{
$message='Ce login est déja présent';
}
}else{
$message='Merci de remplir tous les champs';
}
}
?>
- Résultat du test :
Ici lorsqu’en met un utilisateur déjà existe dans la base de donner il afficher cette erreur :
Créer la Requête d'Accès Sécurisé
Dans cet axe, vous mettez en place la logique pour vérifier les informations d’identification lors de la connexion. Le code PHP vérifie si les informations de connexion fournies par l’utilisateur sont correctes et affiche un message en conséquence.
- Code PHP mis à jour de acces.php :
prepare($sql2);
$req2->execute(
array(
':login'=> $login,
':pass' => $pass
)
);
$count = $req2->rowcount();
if($count > 0){
$message = 'ACCES OK';
} else{
$message='Erreur de Login et/ou de Password';
}
}else{
$message='Merci de remplir tous les champs';
}
}
?>
- Résultat du test :
Ici, si vous utilisez un identifiant déjà inscrit, comme steve_jobs, avec un mot de passe incorrect, comme 456, un message d’erreur s’affichera, indiquant que l’identifiant ou le mot de passe est incorrect
Sinon c’est vous avez saisir le login et le mot de passe corrcete comme steve_jobs ave le code de 123 voila le résultat :
Crypter un Mot de Passe en Base de Données en PHP 8
Pour améliorer la sécurité de votre application, il est crucial de ne pas stocker les mots de passe en clair dans la base de données. Le processus de cryptage (ou plutôt de hachage, dans le contexte des mots de passe) permet de stocker une version sécurisée du mot de passe qui est difficile à déchiffrer même si la base de données est compromise.
- Exemple de code pour index.php :
Dans le fichier index.php, il suffit de modifier cette ligne pour attribuer une valeur au champ pass comme ceci :
':pass' => password_hash($pass,PASSWORD_DEFAULT)
- Résultat du test :
Dans ce cas, vous avez inséré un nouvel utilisateur nommé Marc avec un mot de passe 789. Voici comment il est inséré dans la table user de la base de données alphorm :
Utiliser password_verify pour Vérifier le Mot de Passe
Contrairement aux algorithmes de chiffrement traditionnels, les mots de passe ne sont pas réellement « décryptés » lorsqu’ils sont vérifiés. Au lieu de cela, un mot de passe est comparé au hachage stocké en utilisant des techniques de vérification sécurisées. En PHP, cela se fait avec la fonction password_verify.
- Exemple de Code pour acces.php :
Voici le code modifié pour acces.php, utilisant password_verify
pour vérifier le mot de passe de l’utilisateur :
prepare($sql2);
$req2->execute(
array(
':login'=> $login
)
);
$data = $req2->fetch(PDO::FETCH_ASSOC);
if(password_verify($pass,$data['pass'])){
$message = 'ACCES OK';
} else{
$message='Password incorrect ';
}
}else{
$message='Merci de remplir tous les champs';
}
}
?>
- Résultat du test :
Voici un test avec le dernier utilisateur que vous avez inscrit, qui est Marc avec le mot de passe 789 :
Développer la Zone Admin en PHP 8
Pour mettre en place une zone d’administration dans votre application, voici le code de base pour admin/index.php. Ce code vérifie la session de l’utilisateur et affiche l’identifiant de l’utilisateur s’il est connecté en tant qu’administrateur :
- Exemple de Code pour admin/index.php:
Zone Admin
Zone Admin
= $userID; ?>
Explication du Code :
- Session Start :
- session_start() est appelé au début pour démarrer la session PHP. Cela permet de gérer les variables de session comme
$_SESSION['userID'].
- session_start() est appelé au début pour démarrer la session PHP. Cela permet de gérer les variables de session comme
- Vérification de la Session :
- if
(isset($_SESSION['userID'])) { ... }
: Cette condition vérifie si la variable de session userID existe. Si oui, elle récupère la valeur de$_SESSION['userID']
dans la variable $userID.
- if
- Affichage dans la Zone Admin :
- À l’intérieur de la section HTML,
<h1>Zone Admin</h1>
affiche le titre de la page. <?= $userID; ?>
affiche dynamiquement l’identifiant de l’utilisateur connecté. Vous pouvez personnaliser cette section pour afficher d’autres informations pertinentes pour l’administration.
- À l’intérieur de la section HTML,
- Résultat du test :
Organiser le Code PHP 8 dans des Fichiers Séparés
Dans cette section Vous avez bien structuré votre code en déplaçant la logique PHP dans un fichier séparé _script.php. Cela rend le code plus maintenable et réutilisable. Voici un récapitulatif et quelques ajustements mineurs pour optimiser votre approche.
- Fichier « _script.php « :
prepare($sql2);
$req2->execute(
array(
':login'=> $login
)
);
$count = $req2->rowcount();
if($count <=0){
//on insert le nouvel utilisateur
$sql='INSERT INTO user (login,pass) VALUES (:login,:pass)';
$req=$cnx->prepare($sql);
$req->execute(
array(
':login'=>$login,
':pass' => password_hash($pass,PASSWORD_DEFAULT)
)
);
$message='Votre compte a bien été créé';
} else{
$message='Ce login est déja présent';
}
}else{
$message='Merci de remplir tous les champs';
}
}
}elseif($fichier == 'ACCESCOMPTE'){
if(isset($_POST['acces'])){
$login = $_POST['login'];
$pass = $_POST['pass'];
if(!empty($login) || !empty($pass)){
// on vérifier si le login sont ok
$sql2='SELECT login,pass FROM user WHERE login = :login';
$req2 = $cnx->prepare($sql2);
$req2->execute(
array(
':login'=> $login
)
);
$data = $req2->fetch(PDO::FETCH_ASSOC);
if(password_verify($pass,$data['pass'])){
$_SESSION['userID'] = $data['userID'];
header('location:admin/');
} else{
$message='Password incorrect ';
}
}else{
$message='Merci de remplir tous les champs';
}
}
}
?>
- Code pour index.php
Code pour acces.php :
Résumé des Meilleures Pratiques de Sécurité PHP 8
Dans cet article, vous avez appris à sécuriser les mots de passe des utilisateurs en les cryptant avant de les stocker dans une base de données et à les décrypter lors de l’accès. Les étapes principales incluent la configuration de la base de données, la création de formulaires d’inscription et de connexion, et l’utilisation des fonctions PHP pour le cryptage et le décryptage des mots de passe.
Fonction PHP | Utilisation |
---|---|
password_hash() | Crypter un mot de passe avant de le stocker en base de données.
|
password_verify() | Vérifier un mot de passe crypté lors de la connexion.
|
Points Clés
- Cryptage : Utilisation de
password_hash()
pour sécuriser le mot de passe avant de l’insérer dans la base de données. - Décryptage : Vérification du mot de passe à l’aide de
password_verify()
pour comparer l’entrée utilisateur avec le mot de passe crypté stocké.
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui. Découvrez des cours variés pour tous les niveaux !
Conclusion
La sécurisation des mots de passe en PHP 8 est cruciale pour protéger les données utilisateur. En utilisant des fonctions comme password_hash
et password_verify
, vous pouvez renforcer la sécurité de votre application PHP 8. De plus, une gestion efficace de la base de données et une zone d’administration sécurisée sont essentielles pour maintenir une application fiable et performante.