PHP password_verify返回false

3
我有两个项目,其中一个用于检查用户名和密码是否存在于数据库中,使用了password_verify()函数,而另一个则可以注册后登录。但是在第二个项目中,尽管我写了相同的代码但更改了表名,但函数password_verify始终返回false。我会发布这个项目,所以如果有人能帮忙,请联系我。 我已经检查了它正常连接到数据库并正确返回电子邮件结果,但是当比较哈希密码与输入的密码时,它总是错误的。
Index.php是主页,只包含两行php代码:
1. include("signup.php");
2. include("login.php"); Connection.php
   <?php
$server="localhost";
$db_username="myusername";
$db_password="mypassword";
$db="test_db";

$conn=mysqli_connect($server,$db_username,$db_password,$db);


if(!$conn)
    die ("Connection Failed: ".mysqli_connect_error());


?>

signup.php

<?php
session_start();
if(isset($_POST['signup']))
{   
     function validateFormData($formData)
    {
        $formData=trim(stripcslashes(htmlspecialchars($formData)));
        return $formData;
    }

    $email=validateFormData($_POST['email']);
    $password=validateFormData($_POST['password']);

    if(!$_POST['email'])
        $error.="Please enter an email<br>";

    else if(!filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
    {
        $error.="Please enter a valid email<br>";
    }

    if(!$_POST['password'])
        $error.="Please enter a password<br>";

    else
    {
        if(strlen($_POST['password'])<8)
            $error.="Password must contain at least 8 characters<br>";

        if(!preg_match('`[A-Z]`',$_POST['password']))
            $error.="Password must contain at least one capital letter<br>";
    }

    if($error)
    {
        echo "<div class='alert alert-danger text-center lead'><a class='close red' data-dismiss='alert'>&times;</a>".$error."</div>";
    }
    else
    { 
        include('connection.php');

        $query="SELECT * FROM `diary` WHERE email='".mysqli_real_escape_string($conn,$email)."'";

        $result=mysqli_query($conn,$query);
        $results=mysqli_num_rows($result);

        if($results)
            echo "<div class='alert alert-danger text-center lead'>This email already exists, do you want to log in?<a class='close red' data-dismiss='alert'>&times;</a></div>";

        else
        {
         $selectUser=mysqli_real_escape_string($conn,$email);
         $hashedPass=password_hash($password,PASSWORD_DEFAULT);
         $query="INSERT INTO `diary`(`email`, `password`) VALUES ('$selectUser','$hashedPass')";   
         mysqli_query($conn,$query);
         echo "<div class='alert alert-success text-center lead'>You've been signed up!<a class='close green' data-dismiss='alert'>&times;</a></div>";

         $_SESSION['id']=mysqli_insert_id($conn);


        }
 }

}


?>

login.php

<?php

if(isset($_POST['login']))
{


    function validateFormData($formData)
    {
        $formData=trim(stripcslashes(htmlspecialchars($formData)));
        return $formData;
    }


    $formEmail=validateFormData($_POST['loginEmail']);
    $formPass=validateFormData($_POST['loginPassword']);
    $newPass=password_hash($formPass,PASSWORD_DEFAULT);
    echo $newPass;

    include("connection.php");

    $query="Select * from diary where email='$formEmail' ";

    $result=mysqli_query($conn,$query);

      if(mysqli_num_rows($result)>0)
    {
        while($row=mysqli_fetch_assoc($result))
        { 
            $LogEmail= $row['email'];
            $LogPass= $row['password'];
            echo "<br>".$LogPass;

        }
        if(password_verify($newPass,$LogPass))
        {
            echo "<br>Correct Password";    
        }
          else
              echo "<br>Not Correct"; 
    }


}

?>

``` Index ```
输出$newPass是:" $2y$10$dw0AtEExMc41p4nUB3W9kOOWTcNZmQev9jM4emNn7oQNODfu6Ld.q" 输出$LogPass是:" $2y$10$biz6Z5nxsMZXNf7p3ebqw.pksPb1VhWEmoan776rMqOC7VcFRQbrK"
<?php

include("signup.php");
include("login.php");

?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">
    <title>Secret Diary</title>

    <link rel="stylesheet" href="css/Normalize.css">
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" href="css/style.css">

    <!--[if IE]>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

</head>

<body>
    <div class="container">
      <form class="form-horizontal emailForm" role="form" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
          <legend><h1 class="text-center">Sign Up</h1></legend>
        <div class="form-group">
          <label class="control-label col-sm-2" for="email" >Email:</label>
          <div class="col-sm-10">
             <input type="email" class="form-control" style="width:90%" id="email" placeholder="Enter Email"  name="email" value="<?php echo addslashes($_POST['email']);?>">   
          </div>
        </div>
        <div class="form-group">
          <label class="control-label col-sm-2" for="pwd">Password:</label>
          <div class="col-sm-10">
            <input type="password" class="form-control" style="width:90%" id="pwd" placeholder="Password" name="password">
          </div>
        </div>
        <div class="form-group">
          <div class="col-sm-offset-2 col-sm-10">
            <button type="submit" class="btn btn-success " id="btnClick" name="signup">Sign Up</button>
          </div>
        </div>
      </form><!--SIGN UP-->

         <form class="form-horizontal emailForm" role="form" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
          <legend><h1 class="text-center">Log In</h1></legend>
        <div class="form-group">
          <label class="control-label col-sm-2" for="LogInEmail" >Email:</label>
          <div class="col-sm-10">
             <input type="email" class="form-control" style="width:90%" id="LogInEmail" placeholder="Enter Email"  name="loginEmail" value="<?php echo addslashes($_POST['loginEmail']);?>">   
          </div>
        </div>
        <div class="form-group">
          <label class="control-label col-sm-2" for="LogInPassword">Password:</label>
          <div class="col-sm-10">
            <input type="password" class="form-control" style="width:90%" id="LogInPassword" placeholder="Password" name="loginPassword">
          </div>
        </div>
        <div class="form-group">
          <div class="col-sm-offset-2 col-sm-10">
            <button type="submit" class="btn btn-success " id="btnClick" name="login">Log In</button>
          </div>
        </div>
      </form><!--LOG IN-->
</div>
    <script src="js/JQuery.min.js"></script>
    <script src="bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
    <script src="js/script.js" type="text/javascript"></script>
</body>
</html>

我可以把这个项目发送给你,它只有注册和登录功能,也许你可以更好地了解问题所在。 - Mohammad Halawi
当用户注册时,密码会被哈希并存储在数据库中。当用户想要登录时,我从<input>中获取密码,并使用password_verify将其与数据库中的哈希值进行比较,但它总是返回false,是的,它给出了$formPass的哈希值。 - Mohammad Halawi
我是这个网站的新手,所以不知道如何更新我的问题,但我重新写了一遍,下面是它的内容,并且有两个输出,我不知道这是否是您想要的。 - Mohammad Halawi
1
好的,请现在检查它们,看看这是否是您要求的。 - Mohammad Halawi
不,我原本以为可以两者兼得,但现在我改成了最后一个。 - Mohammad Halawi
显示剩余5条评论
2个回答

4
当您包含dbconnection时,将覆盖您的$password。
include('connection.php');

拥有:

$password="mypassword";

之前您设置了:

$password=validateFormData($_POST['password']);

因此,您的哈希密码不是用户的密码,而是数据库密码。

我建议将所有数据库凭据变量前缀为db_。因此,您的数据库密码变量将变为$db_password。这将允许您在整个项目中拥有不同的变量(我认为)。

此外,您应该使用$formPass而不是$newpass。在verify函数中,$newpass将被双重哈希。

$formEmail=validateFormData($_POST['loginEmail']);
$formPass=validateFormData($_POST['loginPassword']);
$newPass=password_hash($formPass,PASSWORD_DEFAULT);

所以改变:

if(password_verify($newPass,$LogPass))

to:

if(password_verify($formPass, $LogPass))

好的,我将变量password改为db_password,并在login.php中对表单数据进行了哈希处理并输出,它返回了"$2y$10$boLdsZ6VRceuEf4x7x8II.in9yHN0nCDFLABEU5xJg.8BjvVvB6uC"。 - Mohammad Halawi
并且 $LogPass 回显 "$2y$10$biz6Z5nxsMZXNf7p3ebqw.pksPb1VhWEmoan776rMqOC7VcFRQbrK" 以便它们不同。 - Mohammad Halawi
抱歉,哈希值为$formPass而不是表单数据。 - Mohammad Halawi

0

password_verify 期望将明文密码作为其第一个参数。要修复您的代码,请删除此行:

$newPass=password_hash($formPass,PASSWORD_DEFAULT);

并更改此行:

if(password_verify($newPass,$LogPass))

转化为以下内容:

if(password_verify($formPass,$LogPass))

嘿 @chris85,在问题仍未解决时我就到了。当我发帖时还没有人写过答案,而且大部分评论讨论都被隐藏了。我只是看到了 login.php 中的问题并写了一些内容。直到现在(读了你的回答),我才意识到在我的到来之前已经修复了其他问题(例如数据库密码覆盖)。 - BeetleJuice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接