Warum funktioniert password_verify nicht?
ich habe ein Login-System in PHP gebaut, aber aus irgendeinem Grund funktioniert die Passwortüberprüfung mit password_verify nicht, obwohl die Eingaben korrekt zu sein scheinen. Hier ist der relevante Codeabschnitt:
<?php
// login.php
session_start();
include 'db.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = filter_input(INPUT_POST, "username", FILTER_SANITIZE_SPECIAL_CHARS);
$password = filter_input(INPUT_POST, "password", FILTER_SANITIZE_SPECIAL_CHARS);
$stmt = $conn->prepare("SELECT * FROM user WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
if ($user && password_verify($_POST['password'], $user['password'])) {
$_SESSION['id_user'] = $user['id_user'];
$_SESSION['role'] = $user['role'];
header('Location: index.php');
} else {
echo "Invalid credentials";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form method="POST">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Login</button>
</form>
</body>
</html>
1 Antwort
Vom Beitragsersteller als hilfreich ausgezeichnet
Von gutefrage auf Grund seines Wissens auf einem Fachgebiet ausgezeichneter Nutzer
SQL, Datenbank, Programmieren & Softwareentwicklung
- Achte darauf, überall mit der selben Zeichenkodierung zu arbeiten. Auch bei der Verbindung zur Datenbank kannst du explizit vorgeben, mit welcher Zeichenkodierung gearbeitet werden soll (siehe mysqli::set_charset).
- Schau nach, ob die Datenbankspalte für den Passworthash die Mindestlänge von 72 Zeichen zulässt.
- Stelle sicher, dass das Passwort bei der Registrierung via password_hash zu einem Hash konvertiert und so dann auch unbearbeitet (Ausnahme: Konversion durch den Prepared Statement) in die Datenbank geschrieben wird.
- Lass dir zu Prüfzwecken die Zwischenergebnisse ausgeben ($user, $_POST['password'], $user['password']).
PS.: Die $password-Variable ist bei dir ungenutzt. Wieso du sie durch einen Filter ziehst, kann ich nicht nachvollziehen.