Par Valentin Brosseau / @c4software
Imaginez : votre base de données se retrouve dans la nature.
Question : que découvre la personne qui l'ouvre ?
| id | email | mot_de_passe |
| 1 | alice@exemple.com | azerty123 |
| 2 | bob@exemple.com | jaimelechat |On ne compare pas des mots de passe, on compare des empreintes.
echo md5('mdp'); // 6f8db599de986fab7a21625b7916589cQuestion : pourquoi ces fonctions ne suffisent-elles plus aujourd'hui ?
Une valeur aléatoire ajoutée au mot de passe avant le hachage.
password_hash('mdp', PASSWORD_DEFAULT); // $2y$10$Rk1s...
password_hash('mdp', PASSWORD_DEFAULT); // $2y$10$9dZv...Même mot de passe, deux résultats différents.
La lenteur est ici une fonctionnalité.
$hash = password_hash($password, PASSWORD_DEFAULT);if (password_verify($password, $user['mot_de_passe'])) {
// C'est la bonne personne
}Le sel est dans le hash : rien d'autre à stocker.
$stmt = $pdo->prepare("SELECT * FROM utilisateurs WHERE email = ?");
$stmt->execute([$email]);Un formulaire de connexion, c'est la cible numéro 1 de l'injection SQL.
« Cet email n'existe pas » ou « Mot de passe incorrect » ?
Question : pourquoi ces deux messages sont-ils une mauvaise idée ?
« Email ou mot de passe incorrect. »
Sinon votre formulaire devient un outil pour découvrir les comptes existants.
session_regenerate_id(true);À la connexion, on change l'identifiant de session : l'ancien ne sert plus à rien.
INSERT.SELECT préparé, password_verify.password_hash() pour enregistrer, password_verify() pour vérifier.session_regenerate_id() à la connexion.Place au TP 🚀