Heim >Datenbank >MySQL-Tutorial >Wie authentifiziert man Benutzer sicher mit in einer Datenbank gespeicherten Salted-Passwörtern?
So entziehen Sie ein Salted-Passwort aus der Datenbank und authentifizieren einen Benutzer
Beim Implementieren einer Mitgliederseite mit Salted-Passwörtern, die in einer Datenbank gespeichert sind, Die Sicherstellung einer korrekten Authentifizierung wird von entscheidender Bedeutung. Beim Versuch, die Existenz eines Benutzers zu überprüfen, können jedoch Fehler auftreten.
Das Problem
Der folgende Codeausschnitt zeigt eine falsche Methode zur Überprüfung, ob ein Mitglied existiert:
$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'];
Dieser Code versucht, das Salt aus der Datenbank abzurufen, schlägt jedoch fehl, wenn die Abfrage zurückkehrt falsch.
Die Lösung
Um die Anmeldeinformationen eines Benutzers genau zu überprüfen, müssen wir den gespeicherten Passwort-Hash abrufen und ihn mit dem vom Benutzer eingegebenen Passwort vergleichen. Dieser Prozess beinhaltet die Verwendung der Funktionen password_hash() und password_verify().
Beispielcode für MySQLi
/** * mysqli example for a login with a stored password-hash */ $mysqli = new mysqli($dbHost, $dbUser, $dbPassword, $dbName); $mysqli->set_charset('utf8'); // Find the stored password hash in the database, searching by username $sql = 'SELECT password FROM users WHERE name = ?'; $stmt = $mysqli->prepare($sql); $stmt->bind_param('s', $_POST['name']); // it is safe to pass the user input unescaped $stmt->execute(); // If this user exists, fetch the password-hash and check it $isPasswordCorrect = false; $stmt->bind_result($hashFromDb); if ($stmt->fetch() === true) { // Check whether the entered password matches the stored hash. // The salt and the cost factor will be extracted from $hashFromDb. $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb); }
Beispielcode für PDO
/** * pdo example for a login with a stored password-hash */ $dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8"; $pdo = new PDO($dsn, $dbUser, $dbPassword); // Find the stored password hash in the database, searching by username $sql = 'SELECT password FROM users WHERE name = ?'; $stmt = $pdo->prepare($sql); $stmt->bindValue(1, $_POST['name'], PDO::PARAM_STR); // it is safe to pass the user input unescaped $stmt->execute(); // If this user exists, fetch the password hash and check it $isPasswordCorrect = false; if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) { $hashFromDb = $row['password']; // Check whether the entered password matches the stored hash. // The salt and the cost factor will be extracted from $hashFromDb. $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb); }
Das obige ist der detaillierte Inhalt vonWie authentifiziert man Benutzer sicher mit in einer Datenbank gespeicherten Salted-Passwörtern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!