Comment faire la distinction entre les mots de passe salés et simples dans l'authentification de base de données
Dans l'authentification de base de données, la protection des mots de passe est cruciale. Une technique répandue consiste à utiliser des mots de passe salés, dans lesquels une chaîne aléatoire (salt) est ajoutée au mot de passe avant le hachage. Cela améliore la sécurité en rendant exponentiellement plus difficile le déchiffrement des mots de passe.
Le défi : vérifier les connexions des membres
Lors de la mise en œuvre d'un site membre avec des mots de passe salés stockés dans MySQL, un problème courant une erreur se produit pendant le processus d’authentification de connexion. Les tentatives de connexion semblent contourner les vérifications de mot de passe de manière incorrecte, permettant un accès non autorisé au site.
Inspection du code du problème
L'extrait de code suivant est utilisé pour valider les connexions des membres :
$name = mysqli_real_escape_string($connect, $_POST['name']); $password = mysqli_real_escape_string($connect, $_POST['password']); $saltQuery = "SELECT salt FROM users WHERE name = '$name';"; $result = mysqli_query($connect, $saltQuery); if ($result === false){ die(mysqli_error()); } $row = mysqli_fetch_assoc($result); $salt = $row['salt']; $saltedPW = $password . $salt; $hashedPW = hash('sha256', $saltedPW); $sqlQuery = "SELECT * FROM users WHERE name = '$name' AND password = '$hashedPW'"; if (mysqli_query($connect, $sqlQuery)){ echo '<h1>Welcome to the member site '.$name.'</h1>'; } else { echo 'error adding the query: '.$sql_q.'<br> Reason: '.mysqli_error($connect); }
La solution : une vérification appropriée du mot de passe
Le problème provient de l'utilisation d'une comparaison directe de mot de passe dans la requête SQL. Étant donné que les mots de passe stockés sont salés, cette méthode interprète à tort toutes les tentatives de connexion comme valides. Pour remédier à cela, nous devons mettre en œuvre les étapes suivantes :
Exemple de code utilisant mysqli :
// Connect to the database $mysqli = new mysqli($servername, $username, $password, $dbname); // Initialize variables $username = mysqli_real_escape_string($mysqli, $_POST['username']); $password = mysqli_real_escape_string($mysqli, $_POST['password']); // Fetch the salted hash for the specified username $query = "SELECT password FROM users WHERE username = ?"; $stmt = $mysqli->prepare($query); $stmt->bind_param('s', $username); $stmt->execute(); $stmt->bind_result($hashedPassword); $stmt->fetch(); // Verify the entered password if (password_verify($password, $hashedPassword)) { // Login successful echo '<h1>Welcome to the member site '.$username.'</h1>'; } else { // Password did not match echo 'Invalid login credentials'; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!