无法获取password_verify以验证散列密码

时间:2017-08-06 15:29:16

标签: php mysqli prepared-statement

我有以下设置,我尝试验证用户的密码以便将其登录,但我仍然坚持密码验证。

指向数据库的链接:

$conn=mysqli_connect('localhost','root','');
$tablee='userstable';

表格结构:

users.userid int(11)
users.user_uid varchar(256)
users.user_pwd varchar(256)
users.user_perm int(5)
users.user_email varchar(256)

表格:

echo '<form action="'.getLogin($conn,$tablee).'" method="post">
<input type="text" name="uid">
<input type="password" name="pwd">
<input type="submit" name="loginSubmit" value="Login">
</form>';

功能:

function getLogin($conn,$tablee) {
if (isset($_POST['loginSubmit'])){
    $uid=mysqli_real_escape_string($conn,$_POST['uid']);
    $pwd=mysqli_real_escape_string($conn,$_POST['pwd']);
    $stmt=$conn->prepare("SELECT user_id,user_uid,user_pwd,user_perm,user_email FROM ".$tablee.".users WHERE user_uid=?");
    $stmt->bind_param('s',$uid);
    $stmt->execute();
    $stmt->store_result();
    $result=$stmt->bind_result($userid,$username,$userpassword,$permission,$email);
    $numrow=$stmt->num_rows;
    if ($numrow>0){
        $hashedPasswordCheck=password_verify($pwd,$userpassword);
        if ($hashedPasswordCheck==false) {
            header('Location: index.php?login=wrongpass&pwd='.$pwd.'&ps='.$userpassword.'&user='.$username.'&rows='.$stmt->fetch().'&id='.$userid.'&nr='.$numrow.'&em='.$email.'&length='.strlen($userpassword));
            $stmt->free_result();
            $stmt->close();
            $conn->close();
            exit();
        }
        elseif ($hashedPasswordCheck==true) {
            if ($stmt->fetch()){
                $_SESSION['id']=$userid;
                $_SESSION['perm']=$permission;
                header('Location: index.php?login=success');
                $stmt->free_result();
                $stmt->close();
                $conn->close();
                exit();
            }
            else {
                header('Location: index.php?login=whathappened');
            }
        }
        else {
            header('Location: index.php?login=nothingselected');
            exit();
        }
    }
}
}

我添加了GET参数以查看是否有错误,我收到了一些奇怪的结果。将返回用户标识,用户电子邮件,用户权限,散列密码的长度和行数。但是,用户名和散列密码不是。

我无法弄清楚我做错了什么。

更新:

在php文件中插入echo标签,以避免与上面的表格混淆。

忘了展示我如何存储密码。我目前正在测试,所以我只有一个更改密码字段。

表格:

echo '<form action="'.userCh($conn,$tablee).'" method="post">
<input type="password" name="editPassword">
<input type="submit" name="changePass" value="submit">
</form>';


function changePass($conn,$tablee){
if (isset($_POST['editPassword'])){
    $userid=$_SESSION['id'];
    $newPass=mysqli_real_escape_string($conn,$_POST['newch']);
    $hashedPwd=password_hash($newPass,PASSWORD_DEFAULT);
    $sql="UPDATE ".$tablee.".users SET user_pwd=? WHERE user_id=?;";
    $stmt=$conn->prepare($sql);
    $stmt->bind_param('si',$hashedPwd,$userid);
    $stmt->execute();
    header('Location: index.php');
    exit();
}
}

更新

结果是删除包含$stmt->store_result();$numrow=$stmt->num_rows;if (numrow>0){的行,并且相应的}完成了这一操作。但我仍然不明白为什么。它有效,但这四行代码对我来说很有意义。我错过了什么吗?

0 个答案:

没有答案