Par Valentin Brosseau / @c4software
Un utilisateur vous écrit :
« Vous pouvez me renvoyer mon mot de passe par email ? »
Vous ne stockez pas son mot de passe.
Vous stockez un hash :
$2y$12$FSq31Je4IJjlMUhmPOt7...Un hash est à sens unique.
"monSuperMotDePasse" → password_hash() → "$2y$12$k7aP…" ✅
"$2y$12$k7aP…" → ??? → ? ❌C'est qu'il le stocke en clair. 🚨
On ne renvoie pas le mot de passe.
On permet d'en choisir un nouveau, de façon sécurisée.
À votre avis ?
Si vous avez accès à la boîte email du compte…
C'est (probablement) que le compte est à vous.
Une preuve temporaire, impossible à deviner.
Seule la personne qui a accès à la boîte email peut la connaître.
Deux approches classiques.
use Illuminate\Support\Str;
$token = Str::random(64);
// "gT7fKq2Zp9XwB4nRj8..."64 caractères alphanumériques aléatoires.
use Illuminate\Support\Str;
$token = Str::uuid();
// "550e8400-e29b-41d4-a716-446655440000"Universally Unique IDentifier
À votre avis ?
Soit environ 5,3 × 10^36 possibilités.
En générer deux identiques est statistiquement impossible.
Str::random(64) : plus long, non standardisé.Str::uuid() : standardisé, reconnaissable, largement suffisant.Les deux sont imprévisibles : c'est ça qui compte.
Dans le TP nous utiliserons Str::random(64), mais un UUID serait tout aussi valable.
845 203À votre avis, bonne ou mauvaise idée pour un lien de reset ?
1 000 000 de possibilités seulement.
Un script peut toutes les tester en quelques minutes (force brute).
Deux colonnes suffisent :
$table->string('reset_token', 64)->nullable();
$table->dateTime('reset_token_expires_at')->nullable();Un email peut traîner des mois dans une boîte de réception.
Un token éternel = une porte d'entrée éternelle.
30 minutes suffisent largement.
Une fois le mot de passe changé, le token est effacé :
$utilisateur->reset_token = null;
$utilisateur->reset_token_expires_at = null;
$utilisateur->save();Quelqu'un qui retrouve le lien plus tard ? Trop tard.
« Aucun compte n'existe avec cette adresse email. »
Quel est le problème avec ce message ?
Ce message permet de tester si une adresse a un compte chez vous.
Imaginez sur un site de rencontre, ou un site médical…
Toujours la même, que l'email existe ou non :
« Si cette adresse est associée à un compte, un email vous a été envoyé. »
Place au TP 🚀