password_verify不起作用[重复]

问题描述 投票:-1回答:1

'if'检查数据库中是否存在登录(如果登录存在,它将让我登录,如果不存在 - 它不允许我进入)。但是我看到password_verify()无法正常工作,因为当我输入任何密码时(如果登录是正确的)它让我进去。我无法在我的代码中找到错误(在password_hash和password_verify中)。

<?php
session_start();
include '../db.php'
$login = strip_tags($_POST['login']);
$password = strip_tags($_POST['password']);
try {
$stmt = $dbh->prepare("SELECT login, password FROM users");
$stmt->execute();
while ( $row = $stmt->fetch() ) {
$login_in_data = $row['login'];
$password_in_data = $row['password'];
$name_in_data = $row['name'];
}
} 
catch (exeption $e) {            
echo $e->getMessage();
}                              
if ( isset($login) && isset($password) ) {
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("SELECT * FROM users WHERE (`login`, `password`) = (:login, :hashed_password)");
$stmt->bindParam(':login', $login);
$stmt->bindParam(':hashed_password', $hashed_password);
$row = $stmt->fetch();
$stmt->execute();
}

if ($_POST['login'] == $login_in_data ) {
if ( (password_verify($_POST['password'], $hashed_password)) ) {
echo "Здравствуйте, " . $login . " !"; ?> <br> <?php
?> <a href="../personalAccount.php">Личный кабинет</a> <br>
<a href="../index.php">Главная страница</a> <?

$_SESSION['authorized'] = 1;
$_SESSION['login'] = $login;
$_SESSION['password'] = $password;
if( isset($_POST["rememberMe"]) ) {
setcookie('login', $login, time() + 60*60*24*30*60, "/");
setcookie('password', $password, time() + 60*60*24*30*60, "/");
}

if ($_SESSION['authorized'] == 1 ) {
echo " ";
echo "Session started!";
}
}
} else {
echo "Login or password is wrong!";
$_SESSION['authorized'] = 0;
}
?>
php password-hash
1个回答
2
投票

您将$ _POST ['password']与$ password的哈希进行比较,该值设置为$ _POST ['password'],因此很明显它将始终返回true。

除此之外,你有奇怪的代码:

try {
$stmt = $dbh->prepare("SELECT login, password FROM users");
$stmt->execute();
while ( $row = $stmt->fetch() ) {
$login_in_data = $row['login'];
$password_in_data = $row['password'];
$name_in_data = $row['name'];
}
} 
catch (exeption $e) {            
echo $e->getMessage();
}

此代码循环遍历所有用户表,仅保存数据的最后一行。不知道你为什么需要这个。

if ( isset($login) && isset($password) ) {
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("SELECT * FROM users WHERE (`login`, `password`) = (:login, :hashed_password)");
$stmt->bindParam(':login', $login);
$stmt->bindParam(':hashed_password', $hashed_password);
$row = $stmt->fetch();
$stmt->execute();
}

此代码对密码进行哈希处理,然后在数据库中查询匹配的用户名和哈希值,但password_hash()每次调用时都会输出不同的哈希值(请参阅PHP documentation)。此外,你没有使用你正在获取的$row

最后,在会话和cookie中存储密码并不是一个好主意。

进行用户身份验证的简便方法是:

  • 查询数据库以查找匹配用户名的用户(SELECT * from users WHERE login = :login
  • 查看提供的密码是否与数据库用户名哈希匹配,并使用密码验证(password_verify($_POST[$password], $row->password)
  • 将随机令牌存储在用户cookie中并将其散列到memMe cookie的数据库中(请参阅http://php.net/manual/en/function.random-bytes.php
© www.soinside.com 2019 - 2024. All rights reserved.