使用PHP登录时比较用户名和密码

使用PHP登录时比较用户名和密码,php,cakephp,Php,Cakephp,假设我有如下PHP代码: <form action="index.php" method="post" id="myform"> <tr> <td>User Name </td> <td><input type="text" name="text_username" placeholder="your username here" class="validate[required]"/&g

假设我有如下PHP代码:

<form action="index.php" method="post" id="myform">
     <tr>
        <td>User Name </td>
        <td><input type="text" name="text_username" placeholder="your username here" class="validate[required]"/></td>
     </tr>
      <tr>
        <td>Pass Word </td>
        <td><input type="password" name="text_password" placeholder="your password here" class="validate[required]" /></td>
     </tr>
     <?php 
            $userPass = array();
            $userName = array();
            $userID = array();
            include ('include/connectdb.php');
            if(isset($_POST['tbn_submit'])){
                $query = mysql_query("SELECT * FROM tblusers");
                $username = $_POST['text_username'];
                $password = $_POST['text_password'];

                 while($value= mysql_fetch_array($query)){ 
                            $userPass = $value['user_password'];
                            $userName = $value['user_username'];
                            $userID = $value['user_id'];
                                if($username == $userName && $password == $userPass){
                                     header("location:DataInfo.php?uid=".$userID);
                                   }
                                 else if($username != $userName && $password == $userPass) {
                                    echo'<tr><td colspan="2"><center><b style="color:red;">Invalide username or password, please check again!   </b></center></td></tr>';             
                                    }
                }
             }      
    ?>
     <tr>
        <td></td>
        <td><input type="submit" name="tbn_submit" class="btn btn-success" value="Login"/><input type="reset" class="btn btn-warning" value="Cancel"/></td>
     </tr>
     </form>

用户名
传话
问题是:


当我使用错误的用户名和密码时,会显示重复消息
无效用户名或密码,请再次检查很多次我不想这样。我该如何解决这个问题。请任何人帮助我,谢谢

首先,这是非常错误的

为什么要在php中检查密码和登录匹配?您可以进行如下查询:

SELECT * FROM tblusers WHERE username = *username* AND password = *password*
如果查询返回结果,则用户可以登录,否则返回错误消息

然后,代码的问题是,您将所有用户数据库与登录名和密码进行比较。如果pass/login匹配,则将用户重定向到另一个页面,否则将显示错误消息。问题是脚本在不匹配时不会停止

因此,每当username/pass为false时,它都会显示一条错误消息,并针对用户数据库的每一列显示错误消息

如果你能做到这一点,我建议你使用sha1,这样人们就不能阅读纯文本的密码


只需将密码存储在
sha1($password)
中,并将其与
sha1()进行比较

首先,这是非常错误的

为什么要在php中检查密码和登录匹配?您可以进行如下查询:

SELECT * FROM tblusers WHERE username = *username* AND password = *password*
如果查询返回结果,则用户可以登录,否则返回错误消息

然后,代码的问题是,您将所有用户数据库与登录名和密码进行比较。如果pass/login匹配,则将用户重定向到另一个页面,否则将显示错误消息。问题是脚本在不匹配时不会停止

因此,每当username/pass为false时,它都会显示一条错误消息,并针对用户数据库的每一列显示错误消息

如果你能做到这一点,我建议你使用sha1,这样人们就不能阅读纯文本的密码


只需将密码存储在
sha1($password)
中,并将其与
sha1()
进行比较,您的问题可能在于您的查询:

mysql_query("SELECT * FROM tblusers");
您正在从表中选择所有用户,然后对其进行迭代。相反,您希望按用户名选择,然后比较密码:

mysql_query("SELECT * FROM tblusers WHERE user_username = ".$_POST['text_username']);
您可能还需要向该查询添加密码

当然,这对安全性问题和其他问题非常开放,您可能应该转而研究PDO和MySQLi


最后一点,在PHP中使用正确的方式输入密码总是很好的:

您的问题可能是您的查询:

mysql_query("SELECT * FROM tblusers");
您正在从表中选择所有用户,然后对其进行迭代。相反,您希望按用户名选择,然后比较密码:

mysql_query("SELECT * FROM tblusers WHERE user_username = ".$_POST['text_username']);
您可能还需要向该查询添加密码

当然,这对安全性问题和其他问题非常开放,您可能应该转而研究PDO和MySQLi


最后请注意,在PHP中使用正确的方式输入密码总是很好的:

在代码中查询所有已知用户,如果用户名和密码相等,则对每个用户进行检查。这是不必要的慢,不需要从数据库中获取所有用户,只需搜索具有给定用户名的用户

在数据库中存储密码纯文本不是一个好主意,您应该使用像BCrypt这样的散列函数,在数据库中只存储散列后的密码


然后我建议切换到mysqli或PDO,而不是mysql_*函数。mysql函数已被弃用。

在代码中查询所有已知用户,如果用户名和密码相等,则对每个用户进行检查。这是不必要的慢,不需要从数据库中获取所有用户,只需搜索具有给定用户名的用户

在数据库中存储密码纯文本不是一个好主意,您应该使用像BCrypt这样的散列函数,在数据库中只存储散列后的密码


然后我建议切换到mysqli或PDO,而不是mysql_*函数。mysql函数已被弃用。

您从代码中得到的输出是显而易见的。您正在做的是:

  • 从用户表(tblusers)获取所有记录

    mysql_查询(“从tblusers中选择*)

  • 然后循环每个记录

    而($value=mysql\u fetch\u数组($query))

  • 因此,如果table
    tblusers
    有1000条记录,您将收到1000次消息

    您应该将其改写为以下内容:

    include ('include/connectdb.php');
    if(isset($_POST['tbn_submit'])){
      $username = $_POST['text_username'];
      $password = $_POST['text_password'];
      $query = mysql_query("SELECT * FROM tblusers WHERE username = $userName AND password = $userPass");
    
      if(mysql_num_rows($query)){
        $user = mysql_fetch_assoc($query)
        header("location:DataInfo.php?uid=".$user['user_id']);
      } else {
        echo '<tr><td colspan="2"><center><b style="color:red;">Invalide username or password, please check again!   </b></center></td></tr>';             
      }
    }   
    
    include('include/connectdb.php');
    如果(isset($_POST['tbn_submit'])){
    $username=$\u POST['text\u username'];
    $password=$\u POST['text\u password'];
    $query=mysql\u query(“从tblusers中选择*,其中username=$username和password=$userPass”);
    if(mysql_num_行($query)){
    $user=mysql\u fetch\u assoc($query)
    标题(“location:DataInfo.php?uid=“.user['user_id']);
    }否则{
    echo“用户名或密码无效,请再次检查!”;
    }
    }   
    
    请注意以下问题:

    • 变量$userName和$userPass不会在这里转义,请在代码中转义。你可以看看。否则你可能会把自己置于危险之中
    • 您需要修复
      else{}
      块中的标记
    • 所示代码/逻辑中还有其他可能的改进。我刚刚给了你这个主意
    • 同时,您已经在数据库中存储了纯文本密码,您不能这样做!至少使用mysql的功能
    从代码中可以明显看出的输出。您正在做的是:

  • 从用户表(tblusers)获取所有记录

    mysql_查询(“从tblusers中选择*)

  • 然后循环每个记录

    而($value=mysql\u fetch\u数组($query))

  • 因此,如果table
    tblusers
    有1000条记录,您将收到1000次消息

    你应该