password_verify不起作用

时间:2019-03-01 17:30:16

标签: php password-hash

“ 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;
}
?>

1 个答案:

答案 0 :(得分: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中存储一个随机令牌,并将其哈希到数据库中以用于 RememberMe cookie(请参阅http://php.net/manual/en/function.random-bytes.php