【问题标题】:password_verify keeps returning false and I can't find answer anywherepassword_verify 一直返回 false,我在任何地方都找不到答案
【发布时间】:2017-07-25 18:56:41
【问题描述】:

密码验证总是返回 false。我在这里看到了所有答案,但都没有帮助。密码字段是 varchar(255)。当我从数据库中 var_dump 密码时,它显示 string(60) 并且密码正确,但该函数仍然返回 false。 这是存储在数据库中的代码:

if(empty($_POST['pass'])) {
    $passErr = "Password required!";
    $errors[] = "Pass error";
} else {
    $pass = test_input($_POST["pass"]);

    if(!preg_match("/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/", $pass)) {
        $passErr = "Password not well formed";
        $errors[] = "Pass error";
    } else {
        $pass_hashed = password_hash($pass, PASSWORD_DEFAULT);

    }
}
$hash_ver = md5(rand(0, 1000));
$status = "";
$stm = $conn->prepare("INSERT INTO user VALUES(?, ?, ?, ?, ?, ?, ?, ?)");

$stm->bind_param("sssssssi", $id, $pass_hashed, $email, $fName, $lName, $hash_ver, $status, $id_role);

$stm->execute();
echo strlen($pass_hashed);

这是登录脚本的一部分

if(count($array) != 0) {
    echo "<script>alert('Ima gresaka')</script>";
} else {

    include('connectionFile/connection.php');


    $stmt = $conn->prepare("SELECT `name`,`last_name`,`status_verif`,`email`,`password` FROM user WHERE `email`=?");
    $stmt->bind_param("s", $email);
    $stmt->execute();

    if($res = $stmt->get_result()) {
        $count = $res->num_rows;

        if($count == 1) {

            $row = $res->fetch_assoc();
            $passwordb = $row['password'];

            //echo "<p>".$passwordb."</p>";

            $verify = password_verify($pass, $passwordb);

            if($verify) {
                echo "<script>alert('Password match')</script>";
            } else {
                var_dump($verify);
                var_dump($passwordb);
                echo "<script>alert('Password doesnt match')</script>";
            }

        } else {
            echo "<script>alert('0 rows')</script>";
        }

    } else {
        echo "<script>alert('No rows at all')</script>";
    }

}

【问题讨论】:

  • 你试过回显你的$pass吗?打印效果是否如您所愿?
  • 这个方法有什么作用test_input()?也许它正在添加/嵌入一些你不知道的东西。
  • 您也不应该以任何方式操纵密码,这可能是造成这一切的原因。
  • 请评论你的代码,Andrija,它会让你和其他人更容易理解你的代码。
  • 我认为你没有出现在你的问题中。好吧,我会把这个留给你。某些东西正在操纵您的输入,您需要找出原因。您可以随时为未来的用户编辑您的帖子,祝您好运。

标签: php


【解决方案1】:

两个 可能的原因。 :

  • 1) $pass = test_input($_POST["pass"]);

    函数test_input()$_POST['pass'] 字符串做了一些用户不知道的事情。此外,$pass 的值未在第二个代码块中声明。

  • 2)

           $stm = $conn->prepare("INSERT INTO user VALUES(?, ?, ?, ?, ?,
                                ?, ?, ?)");
           $stm->bind_param("sssssssi", $id,$pass_hashed, 
           $email,$fName,$lName, $hash_ver,$status, $id_role);
    

    您插入的值未插入到正确的 SQL 列中,或者您从 SQL 中提取的值不是正确的列,也许您正在提取和比较您插入的 md5 哈希?

如果您可以显示示例输出,例如您是什么var_dump 值状态,将会很有帮助。

展示$pass 在第二个代码块中的设置方式以及test_input 在第一个代码块中的实际作用也将非常有帮助。

您的代码的各个部分都可以改进。

此外,请仔细考虑您的逻辑结构——如果$pass 不适合您的preg_match 怎么办?它仍将被插入到您的数据库中。您需要正确捕获这些类型的流量问题。

Read about how to display PHP error logs,或者更好的是dump them to a file to read in your IDE

【讨论】:

  • “也许您正在提取和比较您插入的 md5 哈希?” - 这不是插入的内容。起初我是这么想的,但是他们插入了正确的变量。那个 MD5 的东西看起来是为了别的东西。
  • @Fred-ii- OP 正在插入这两个值,但由于我们不知道要插入哪些列并且我们没有得到任何数据库示意图,我认为这是一个选项,尽管不可否认,不太可能。
  • 完全正确;完全未知,以及我没有为这个潜在的兔子洞发布答案的更多原因。祝你一切顺利,如果你需要一个好的手电筒,请告诉我 ;-) 编辑:我得跑了。
  • @Fred-ii- 正如伟大的海盗黑胡子所说:“当你消除了不可能的事情时,剩下的一切,无论多么不可能,一定是我的password_hash 没有的原因”工作”
  • @Fred-ii- 我这样做只是为了遗憾!哈哈.....祝你好运,先生!
【解决方案2】:

我认为问题出在变量 $row 之后。它无法识别您的登录脚本中的 $passwordb = $row['password'] 。 试试这样的东西:

// $rows = $res->fetch_assoc();

while( ($row = $res->fetch_assoc()) !== FALSE ) {
    $rows[] = $row;
}

function returnArray( $rows, $string )
{
    foreach( $rows as $row )
    {
    return $row[ $string ];
    }
}

$passwordb = returnArray( $rows, 'password');

//etc.........

【讨论】:

    【解决方案3】:

    感谢您花时间解决我的问题,我设法找到了错误。问题出在 $pass 变量上。包含连接文件后,$pass 变量没有返回我所期望的,因为连接文件中还有另一个 $pass 变量。再次感谢您,抱歉,我还在学习如何正确使用 StackOverflow。

    【讨论】:

      猜你喜欢
      • 2019-05-18
      • 2015-01-28
      • 2017-10-28
      • 1970-01-01
      • 2021-06-20
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多