PHP - password_verify总是返回false

时间:2016-02-26 22:28:15

标签: php

我在使用password_hash和password_verify函数验证密码时遇到了麻烦。 由于某种原因,它总是返回false。

当用户提供电子邮件和密码时,哈希存储在数据库中,如果存在提供的电子邮件的用户的记录,则验证提供的传递和来自该用户记录的哈希(返回false,提供正确的密码)。

以下代码用于测试目的,因为它在真实环境中无法正常工作(数据存储在数据库中)

下面是一些代码。

  <?php
      //create random password with 15 chars
      $pass = generate_random_string(15);
      $hash = password_hash($pass, PASSWORD_BCRYPT);
      var_dump(password_verify($pass, $hash));
      //returns bool(true)

直到这一部分一切正常,它会创建一个传递,哈希并在验证时返回true。 现在是奇怪的部分。

       if (isset($_GET['pass']) &&
           isset($_GET['hash'])) {

            var_dump(password_verify($_GET['pass'], $_GET['hash']));
            //returns bool(false)
       }
   ?>

如果我采用先前生成的值(pass和hash)并传递它们有url参数并验证它们,则返回false。

我在这里做错了什么?

更新

dumping $ _GET数组显示正确的参数和值。

1 个答案:

答案 0 :(得分:2)

尝试在将值附加到网址之前对值进行编码:

$pass = generate_random_string(15);
$hash = password_hash($pass, PASSWORD_BCRYPT);
var_dump(password_verify($pass, $hash));
$pass_encoded = urlencode($pass); // PASS THIS IN THE URL
$hash_encoded = urlencode($hash); // PASS THIS IN THE URL

解码它:

if (isset($_GET['pass']) && isset($_GET['hash'])) {
    var_dump(password_verify(urldecode($_GET['pass']), urldecode($_GET['hash'])));
}