Je vois que vous stockez un hash du mot de passe dans la base de données, mais pour le bénéfice des autres lecteurs, jamais stocker les mots de passe en texte brut dans la base de données. Vous ne voulez pas être like Monster.com.uk!
Vous devez utiliser une fonction de hachage plus forte que MD5()
. Idéalement, vous devriez utiliser SHA256. Cette méthode de hachage est disponible en PHP en utilisant la fonction hash()
.
Vous devez également appliquer un salt aléatoire au mot de passe. Stockez une valeur de sel différente pour le compte de chaque utilisateur. Cela permet de vaincre les attaques par dictionnaire et les attaques rainbow table.
Vous devriez apprendre à utiliser l'extension mysqli au lieu de l'ancienne extension mysql. Mysqli prend en charge les requêtes paramétrées, ce qui vous permet de réduire la vulnérabilité à certaines attaques par injection SQL.
Voici un exemple de code. Je ne l'ai pas testé, mais il devrait être assez proche de travail:
$input_login = $_POST['login'];
$input_password = $_POST['password'];
$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);
while ($stmt->fetch()) {
$input_password_hash = hash('sha256', $input_password . $salt);
if ($input_password_hash == $password_hash) {
return true;
}
// You may want to log failed password attempts here,
// for security auditing or to lock an account with
// too many attempts within a short time.
}
$stmt->close();
// No rows matched $input_login, or else password did not match
return false;
D'autres personnes suggèrent que la requête doit tester login = ? AND password = ?
mais je n'aime pas faire cela. Si vous faites cela, vous ne pouvez pas savoir si la recherche a échoué parce que la connexion n'existait pas ou parce que l'utilisateur a fourni un mot de passe incorrect.
Bien sûr, vous ne devriez pas révéler à l'utilisateur qui a causé la tentative de connexion échouée, mais vous besoin de savoir, de sorte que vous pouvez enregistrer une activité suspecte.
@Javier dit dans sa réponse que vous ne devriez pas récupérer le mot de passe (ou hachage de mot de passe dans ce cas) de la base de données. Je ne suis pas d'accord. Javier montre l'appel md5()
dans le code PHP et l'envoi de la chaîne de hachage qui en résulte à la base de données. Mais cela ne permet pas de saler facilement le mot de passe. Vous devez faire une requête séparée pour récupérer le sel de cet utilisateur avant de pouvoir faire le hachage en PHP.
L'alternative est d'envoyer le mot de passe en texte brut sur le réseau de votre application PHP à votre serveur de base de données. Toute personne mettant sur écoute votre réseau peut voir ce mot de passe. Si vous avez des requêtes SQL enregistrées, toute personne ayant accès aux journaux peut voir le mot de passe. Les hackers motivés peuvent même faire de la benne à la recherche de vieux médias de sauvegarde du système de fichiers, et peuvent lire les fichiers journaux de cette façon!
Le moindre risque est de récupérer la chaîne de hachage du mot de passe de la base de données dans l'application PHP, de la comparer au hachage de l'entrée de l'utilisateur (également dans le code PHP), puis de supprimer ces variables.
Nous avons ici à stackoverflow ne répondons pas aux questions sur les connexions. Nous préférons expliquer, en détail technique, comment désinfecter les entrées des utilisateurs. Il vaut mieux être sûr que d'avoir un site Web fonctionnel. – Grant
@Grant: Vous plaisantez, non? –
Soyez conscient que les réponses sur cette page sont obsolètes et donc dangereuses, jetez un coup d'œil à cette [question] (http://stackoverflow.com/q/4795385/575765) à la place. – martinstoeckli