Mein Registrierungsskript akzeptiert das Passwort eines Benutzers und verwendet dann die PHP-Funktion password_hash, um das Passwort zu verschlüsseln, und speichert es in einer Datenbank. Wenn ich mich mit dem gerade erstellten Benutzer anmelde, erhalte ich den Fehler, der prüft, ob die Passwörter identisch sind oder nicht. In meinem Fall sind sie nicht. Was mache ich falsch, wenn ich im Login-Skript die Funktion password_verify aufruft?PHP password_hash(), password_verify()
REGISTER
if($_SERVER["REQUEST_METHOD"] == "POST"){
function secure($data){
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return($data);
}
$p_num = secure($_POST["p_number"]);
$first_name = secure($_POST["first_name"]);
$last_name = secure($_POST["last_name"]);
$email = secure($_POST["email"]);
$password = secure($_POST["pw"]);
$verify_password = secure($_POST["pw_verify"]);
$program = secure($_POST["program"]);
$role = secure($_POST["role"]);
$logged_in = 0;
$registered = 0;
$image = "../images/profile_placeholder.png";
if($password != $verify_password){
echo "Nope. Passwords";
}
else{
$registered = 1;
$password = password_hash($password, PASSWORD_DEFAULT);
$insert = "INSERT INTO `$user_table`(`user_id`, `first_name`, `last_name`, `password`, `image`, `email`, `program`, `role`, `logged_in`, `registered`) VALUES('" .$p_num ."', '" .$first_name ."', '" .$last_name ."', '" .$password ."', '" .$image ."', '" .$email ."', '" .$program ."', '" .$role ."', '" .$logged_in ."', '" .$registered ."')";
$query = mysqli_query($connect, $insert);
echo "Success!";
}
}
LOGIN
if($_SERVER["REQUEST_METHOD"] == "POST"){
$p_num = $_POST["username"];
$pwd = $_POST["password"];
$query = "SELECT * FROM `$user_table` WHERE `user_id` = '$p_num'";
$result = mysqli_query($connect, $query);
while($row = mysqli_fetch_assoc($result)){
$user_id = "{$row['user_id']}";
$first_name = "{$row['first_name']}";
$last_name = "{$row['last_name']}";
$user_name = $first_name ." " .$last_name;
$password = "{$row['password']}";
$image = "{$row['image']}";
$email = "{$row['email']}";
$program = "{$row['program']}";
$role = "{$row['role']}";
$status = "{$row['logged_in']}";
$registered = "{$row['registered']}";
if(($user_id == $p_num) && (password_verify($pwd, $password))){
$_SESSION["id"] = $user_id;
$_SESSION["user"] = $user_name;
$_SESSION["program"] = $program;
$_SESSION["pass"] = $password;
$_SESSION["image"] = $image;
$_SESSION["email"] = $email;
$_SESSION["role"] = $role;
$_SESSION["status"] = $status;
$_SESSION["registered"] = $registered;
$loggedin = "UPDATE `$user_table` SET `logged_in` = 1 WHERE `user_id` = '$user_id'";
}
var_dump($pwd);
var_dump($password);
}
Hier ist, was ich bekomme, wenn ich Var_dump tun:
string(1) "1" string(16) "$2y$10$0aysCso3b"
So klar, werden die Passwörter nicht abgestimmt sind bekommen ihr. Im Registrierungsskript wird das Kennwort also gehashed und an die Datenbank gesendet. Wenn der Benutzer dann zur Anmeldung übergeht, prüft das Anmeldeskript das Kennwort, das der Benutzer eingegeben hat, um sich anzumelden, und prüft es anschließend anhand des Hash-Kennworts in der Datenbank mit password_verify. Das gehashte Kennwort akzeptiert das unverschlüsselte Kennwort jedoch nicht als Übereinstimmung. Was ich nicht verstehe, ist warum?
Woher kommen '$ pwd' und' $ password' in Ihrem Login-Skript? –
Hoppla, dachte ich kopiere alles. Es wurde der Frage hinzugefügt. –
Hinweis: Sie sollten nach jedem Ihrer Header 'exit;' hinzufügen. Ie .: 'header (" Ort: ../pages/denied_login.php "); exit; ' –