password_verify一直返回false,我无法在任何地方找到答案

时间:2017-07-25 18:56:42

标签: php

密码验证始终返回false。我在这里看到了每个答案,但没有一个帮助。密码字段是varchar(255)。当我从数据库中var_dump密码时,它显示字符串(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>";
    }

}

3 个答案:

答案 0 :(得分:0)

两个 可能的原因。 :

  • 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

答案 1 :(得分:0)

我认为问题出在你的变量$ 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.........

答案 2 :(得分:0)

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