Par Valentin Brosseau / @c4software
Identifier et authentifier.
À votre avis, quelle est la différence ?
Donner un email, tout le monde peut le faire. Le prouver, non.
Un site vous envoie par email…
votre mot de passe que vous aviez oublié.
Bon signe ?
S'il peut vous le renvoyer, c'est qu'il le stocke en clair.
(injection SQL, sauvegarde volée, employé indélicat…)
Une fonction à sens unique :
"monSuperMotDePasse" → password_hash() → "$2y$12$k7aP…" ✅
"$2y$12$k7aP…" → ??? → ? ❌Personne (même pas vous) ne peut retrouver le mot de passe d'origine.
// À l'inscription : on stocke le hash
$hash = password_hash($motDePasse, PASSWORD_DEFAULT);
// À la connexion : on compare (sans jamais « déchiffrer »)
$estValide = password_verify($saisi, $hash); // true / falseDeux utilisateurs choisissent le même mot de passe.
Ont-ils le même hash en base ?
password_hash ajoute automatiquement un sel (salt) : une valeur aléatoire mélangée au mot de passe avant le hash.
Résultat : impossible de repérer les mots de passe identiques, et les tables de hashs précalculés ne servent à rien.
Pour les mots de passe, c'est un hash qu'il faut. Toujours.
Problème : HTTP n'a pas de mémoire.
À la requête suivante, le serveur a tout oublié.
Vous l'avez déjà utilisée en PHP : $_SESSION.
Auth::login($utilisateur); // Ouvre la session
Auth::check(); // Connecté ?
Auth::user(); // Qui est connecté ?
Auth::logout(); // Ferme la sessionAuth::login() fait ce que vous feriez à la main :
$_SESSION['user'] = $id; // PHP pur
$request->session()->put('user', $id); // Laravel « manuel »Laravel stocke l'id en session et recharge l'utilisateur à chaque requête.
$request->session()->regenerate();Après la connexion, on change l'identifiant de session.
À votre avis, contre quelle attaque ?
Un attaquant vous fait utiliser un identifiant de session qu'il connaît déjà, puis attend que vous vous connectiez.
En régénérant l'identifiant après le login, sa session préparée ne vaut plus rien.
Comment interdire /todo aux non-connectés ?
Un « filtre » exécuté avant le contrôleur :
if (!Auth::check()) {
return redirect('/login');
}
return $next($request);Le if que vous auriez copié en haut de chaque page… écrit une seule fois.
Le mot de passe de votre utilisateur a été volé (phishing, fuite ailleurs…).
Votre système tient-il encore ?
Double authentification : deux preuves au lieu d'une.
Un code à 6 chiffres, avec trois garde-fous :
Un TP dédié vous attend pour la coder (pour les plus rapides 😉).
password_hash / password_verify), jamais en clair.Auth:: l'utilise pour vous.Place au TP 🚀