Я искал и читал около 50 сообщений о моей проблеме, но до сих пор не могу понять свою проблему, поэтому я здесь.
Проблема: password_verify()
возвращает false, даже если пароль правильный.
Вот как я храню пароль в db (При регистрации и редактировании профиля)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
И мой последний password_verify()
(я пробовал много примеров, никто не работает, и теперь я сижу здесь с еще не работающим кодом)
public function doLogin($username,$password){ try{ $stmt = $this->conn->prepare("SELECT id, username, password FROM users WHERE username=:username"); $stmt->execute(array(':username'=>$username)); $userRow=$stmt->fetch(PDO::FETCH_ASSOC); if (password_verify($password, $userRow['password'])) { $_SESSION['user_session'] = $userRow['id']; $_SESSION["result"]='You have succesfully logged in your profile!'; return true; }else{ return false; } } catch(PDOException $e) { echo $e->getMessage(); } }
Поле моей базы данных составляет 25 символов. Что здесь не так?
В соответствии с руководством для password_hash()
[…] Поэтому рекомендуется сохранять результат в столбце базы данных, который может расширяться до 60 символов (255 символов будут хорошим выбором)
Это означает, что password_verify()
будет терпеть неудачу, если у вас есть столбец длиной 59 или менее. Поскольку MySQL будет усекать хешированную строку, когда вы вставляете хешированный пароль, ничего не говоря.
Решение состоит в том, чтобы установить столбец password
длиной до 60 или выше – руководство предлагает установить его на 255, так что просто сделайте это.
Любые уже сохраненные пароли не будут фиксировать свои хэши, поэтому их необходимо обновить или повторно вставить.