Aus irgendeinem Grund ist Password_Verify false zurückgegeben, egal was. Ich habe eine var_dump auf den Hash, der aus der Datenbank zurückgegeben wird, und es ist korrekt (mit 60 Zeichen). Ich weiß, dass das eingegebene Passwort korrekt ist. Und ich weiß, dass diese genaue Methode funktioniert, bevor ich auf PDO umschalte (Von dem, was ich gelesen habe, ist PDO sicherer. Außerdem mag ich die Idee, parametrisierte Abfragen zu verwenden).Password_Verify gibt nach dem Wechsel zu PDO immer false zurück?
Sie können meinen alten Code sehen, der funktionierte (er ist auskommentiert). Was ist anders an dem von PDO zurückgegebenen Hash?
<?php
/* When we have all of the input, try to login */
if(isset($_POST['id']) && isset($_POST['password'])){
/* Connect to the database */
//$dbHandle = new Database();
//$dbHandle -> connect();
/* Santitize input to prevent SQL Injection */
//$password = $dbHandle -> sanitize($_POST['password']);
//$id = $dbHandle -> sanitize($_POST['id']);
$password = $_POST['password'];
$id = $_POST['id'];
trim($password);
trim($id);
// Query the Database for the users info
$stmt = $dbHandle -> prepare("SELECT `password`, `admin`, `firstname`, `lastname` FROM users WHERE `id` = :id");
$stmt -> bindParam(":id", $id, PDO::PARAM_INT);
$stmt -> execute();
$result = $stmt -> fetch(PDO::FETCH_ASSOC);
//$result = $dbHandle -> query("SELECT `password`, `admin`, `firstname`, `lastname` FROM users WHERE `id`=$id") -> fetch_assoc();
$hash = $result['password'];
echo($hash . "<br>");
echo(var_dump($hash));
echo($password);
echo(var_dump(password_verify($password, $hash)));
/* Check to see if the user entered the correct password */
if(password_verify($password, $hash)){
//Login
$_SESSION['loggedin'] = true;
$_SESSION['admin'] = $result['admin'];
$_SESSION['name'] = $result['firstname'] . ' ' . $result['lastname'];
/* Update "lastlogin"
** Remember that SQL expects datetime's to be inside single quotes (to make it a string)
*/
$timestamp = date("Y-m-d h:i:s");
$dbHandle -> query("UPDATE `users` SET `lastlogin`='$timestamp' WHERE `id`=$id");
//Send user to home page
header('Location: home.php');
} else {
echo("
<p style='color:red;'>Wrong ID/Password</p>
");
}
}
?>
Das Ergebnis all dieser echos und vardumps sind als
Ausgabe der Schrift folgt
Wenn die '$ dbHandle -> sanitize()' die Rohwerte änderte und Sie diese geänderten Werte speicherten, können sie sich von denen der Rohdateneingabe unterscheiden, ohne dass die '$ dbHandle -> sanitize()' Methode angewendet wurde. Versuchen Sie, diese auch zu tun, sehen Sie, ob Passwörter und solche zusammenpassen. – Rasclatt
'$ dbHandle -> sanitize ($ string)' Ruft nur mysqli_real_escape_string auf $ string. Aber ich werde das versuchen und meine Ergebnisse veröffentlichen. –
Ja, versuchen Sie es, es kann es beheben. – Rasclatt