【问题标题】:PHP change password (old password does not match with the old password inside the database)PHP更改密码(旧密码与数据库内的旧密码不匹配)
【发布时间】:2017-11-12 21:12:55
【问题描述】:

这是我的代码

<?php
  include("connect.php");
  error_reporting(0);
  session_start();

  if($_SESSION['logged'] == true){

      if($_SESSION['user_type'] == 2){
          header("location:admin\home.php");
      }

      $user_id = $_SESSION['user_id'];
      $query = "SELECT * FROM tbl_useraccounts where user_id = $id";

      $q = mysqli_query($con,$query);

      while($row = mysqli_fetch_array($q)){
          $oldpassworddb = $row['password'];
      }

    if($user_id)
    {
        //user is logged in

        if(isset($_POST['submit']))
        {
          //check fields

          $oldpassword = md5($_POST['oldpassword']);
          $newpassword = md5($_POST['newpassword']);
          $repeatnewpassword = md5($_POST['repeatnewpassword']);


          //check passwords
          if ($oldpassword == $oldpassworddb)
          {
             // check two new passwords
             if ($newpassword == $repeatnewpassword)
             {
                //success
                //change password in db
                $querychange = mysqli_query("
                UPDATE tbl_useraccounts SET password='$newpassword' WHERE user_id='$user_id'");

                session_destroy();
                echo "Your password has been changed<br/>
                <a href='home.php'>Return</a>";

             }
             else
                 echo "New passwords doesnt match";


         }
         else
             echo "Old password doesnt match!";



    }
    else
    {

    echo"
    <form action='changepassword.php' method='POST'>
        Old Password: <input type='password' name='oldpassword'><p>
        New Password: <input type='password' name='newpassword'><br>
        Repeat New Password: <input type='password' name='repeatnewpassword'><p>
        <input type='submit' name='submit' value='Change Password'>
    </form>
    ";

      }
  }
  else 
      die("You must be logged in to change your password");

  }else{

      header("location:login.php");
  }
?>      

抱歉,我是 StackOverflow 的新手。当我在密码栏中输入旧密码时,例如“123”,其中 123 实际上是存储在我的数据库中的密码。但是当我点击更改密码时总是响应是“旧密码不匹配”。 123 = 123 应该是正确的。

我的代码有什么错误?

【问题讨论】:

  • 你确实想使用不安全的md5hash算法来存储密码!
  • 查看数据库并告诉我它存储了什么密码?
  • 除了@arkascha 所说的,md5 哈希可以在几秒钟内被破解。我推荐使用password_hash 来散列您的密码。
  • 代码不会说谎,如果您使用md5("something") 并将其与md5("something") 进行比较,您总是会发现它们是相同的。如果你不这样做,那么你正在做两个不同的事情的md5。你应该问自己的问题是它们为什么不同。我一直问自己的问题是,当有数百种解决方案都可以正常工作时,为什么人们还要坚持制作自己的登录/用户管理系统。
  • 也使用参数化查询,因为您当前的方法非常容易进行 SQL 注入。例如你可以给我们php.net/manual/en/mysqli.quickstart.prepared-statements.php

标签: php mysql session passwords


【解决方案1】:

您可能选择了错误的用户:

$user_id = $_SESSION['user_id']; // here you pick in $user_id
$query = "SELECT * FROM tbl_useraccounts where user_id = $id"; // here you check with $id

所以换成

$query = "SELECT * FROM tbl_useraccounts where user_id = $user_id";

print_r($variable) 也可以为您提供帮助。

【讨论】:

  • 我改了但还是=>旧密码不匹配。我的代码中是否有任何输入错误?或者可能是数据库连接
  • $user_id = $_SESSION['user_id']; echo '&lt;pre&gt;'; print_r($user_id); echo '&lt;/pre&gt;'; 之后写下以下代码并告诉我结果
  • 上面写着 2。很抱歉这么晚才回复。希望在这里看到您的下一个回复。谢谢
  • 现在检查数据库。 user_id = 2 的用户是否存在?和 密码是否加密。此外,您可以使用与 print_r 相同的先前技术来检查该行的输出。如果您发现特定行缺少输出,则可以更具体地说明您的错误在哪里。
【解决方案2】:

更改以下内容:

$user_id = $_SESSION['user_id'];
$query = "SELECT * FROM tbl_useraccounts where user_id = $id";

$user_id = $_SESSION['user_id'];
$query = "SELECT * FROM tbl_useraccounts where user_id = $user_id";

您已将用户 ID 存储在 $user_id 变量中,但使用未定义的 $id 变量。

【讨论】:

  • 已更改但仍无法正常工作。现在是我的数据库的问题吗?
【解决方案3】:

您在 where 语句中使用了 $id$user_id

$user_id = $_SESSION['user_id'];

$query = "SELECT * FROM tbl_useraccounts where user_id = $id";

$q = mysqli_query($con,$query);
while($row = mysqli_fetch_array($q)){
    $oldpassworddb = $row['password'];
}

您可以像这样转储数据库中的值:

$user_id = $_SESSION['user_id'];
$query = "SELECT * FROM tbl_useraccounts where user_id = $id";

$q = mysqli_query($con,$query);
        while($row = mysqli_fetch_array($q)){
            $oldpassworddb = $row['password'];
            var_dump($oldpassworddb);
        }

检查数据库中有多少用户。转储您的旧密码并将其与您提供的密码进行比较。如果不匹配,请更改数据库中的密码,结果为:

var_dump(md5('123'));

然后再次运行您的代码。在这一点上,我们无法确定您的数据库中有什么;)

【讨论】:

  • 我现在改了密码还是不匹配
  • @JpTamayo 你能告诉我们你的数据库里有什么吗?
猜你喜欢
  • 1970-01-01
  • 2017-04-16
  • 2014-12-10
  • 2011-06-28
  • 2014-07-27
  • 2013-10-18
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多