【问题标题】:password_verify function not working密码验证功能不起作用
【发布时间】:2016-02-27 04:26:16
【问题描述】:

大家好,我在使用 password_verify 函数时遇到了问题。 注册正在工作,但由于某些奇怪的原因,当我尝试使用它进行登录时它只是说不正确。

这是我的代码(请不要评判,我对一切都还很陌生。

$username = $_POST['username'];
$password = $_POST['password'];
$SQLSelect = $odb -> prepare("SELECT * FROM `users` WHERE `username` = :username");
$SQLSelect -> execute(array(':username' => $_POST['username']));
while ($show = $SQLSelect -> fetch(PDO::FETCH_ASSOC))
{
$passwordHash = $show['password'];
}
$date = strtotime('-1 hour', time());
$attempts=$odb->query("SELECT COUNT(*) FROM `loginlogs` WHERE `ip` = '$ip' AND `username` LIKE '%failed' AND `date` BETWEEN '$date' AND UNIX_TIMESTAMP()")->fetchColumn(0);

//Check fields
if (empty($username) || empty($password) || !ctype_alnum($username) || strlen($username) < 4 || strlen($username) > 15)
{
die(error('Please fill in all fields.'));
}

//Check login details
echo $passwordHash;
$SQLCheckLogin = $odb -> prepare("SELECT COUNT(*) FROM `users` WHERE `username` = :username AND `password` = :password");
$SQLCheckLogin -> execute(array(':username' => $username, ':password' => password_verify($password, $passwordHash)));
$countLogin = $SQLCheckLogin -> fetchColumn(0);
if (!($countLogin == 1))
{
$SQL = $odb -> prepare("INSERT INTO `loginlogs` VALUES(:username, :ip, UNIX_TIMESTAMP(), 'XX')");
$SQL -> execute(array(':username' => $username." - failed",':ip' => $ip));
die(error('Username or password are invalid.'));

有人知道为什么这不起作用吗?我仔细检查了所有内容,应该没问题,echo $passwordHash 只是我检查我是否能够获得正常工作的密码。 :/

【问题讨论】:

  • 我稍微修改了代码,看看这是否可行,但它没有改变任何东西,$passwordVerified = password_verify($password, $passwordHash); $SQLCheckLogin -&gt; execute(array(':username' =&gt; $username, ':password' =&gt; $passwordVerified));
  • 可能是您的列的大小太小,密码哈希在保存到数据库之前被截断。如果它的大小小于 varchar(255),则将其设置为 varchar(255)。
  • @RahulJha 我的矿在更改为 255 后为 40,哈希值更大但仍然无法正常工作,也许是我的寄存器? $insertUser = $odb -> prepare("INSERT INTO users VALUES(NULL, :username, :password)"); $insertUser -> execute(array(':username' => $username, ':password' => password_hash($password, PASSWORD_DEFAULT)));
  • $passwordVerified= password_verify($password, $passwordHash);回声 $passwordVerified;什么是输出?

标签: php sql pdo php-password-hash


【解决方案1】:

password_verify($password, $passwordHash) 这将返回一个布尔值。您应该做的是使用它来验证密码是否与哈希匹配。删除所有这些:

$SQLCheckLogin = $odb -> prepare("SELECT COUNT(*) FROM `users` WHERE `username` = :username AND `password` = :password");
$SQLCheckLogin -> execute(array(':username' => $username, ':password' => password_verify($password, $passwordHash)));
$countLogin = $SQLCheckLogin -> fetchColumn(0);
if (!($countLogin == 1))

只需这样做:

if (!password_verify($password, $passwordHash)) {
    // ...
    die(error('Username or password are invalid.'));
}

【讨论】:

  • 这样走怎么验证用户名?
  • 我是 stackoverflow 的新手,刚刚接受,谢谢。我该如何关闭它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2016-08-16
  • 2018-06-10
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多