0

假设我有如下 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>

问题:

当我使用错误的用户名和密码时,它会Invalide username or password, please check again!多次显示重复消息,我不想这样。我该如何解决这个问题。请帮助我,谢谢

4

5 回答 5

1

这是非常错误的,首先,

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

SELECT * FROM tblusers WHERE username = *username* AND password = *password*

如果查询返回结果,则用户可以登录,否则,错误消息。

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

所以每次用户名/密码为假时,它都会显示一条错误消息,并且对于您的用户数据库的每一列。

如果你得到这个工作,我建议你使用 sha1 这样人们就无法读取纯文本密码......

只需将密码存储sha1($password)并与sha1().

于 2012-09-26T08:13:02.167 回答
1

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

mysql_query("SELECT * FROM tblusers");

您正在从表中选择所有用户,然后对其进行迭代。相反,您想按用户名选择,然后比较密码:

mysql_query("SELECT * FROM tblusers WHERE user_username = ".$_POST['text_username']);

您可能还想为该查询添加密码。

当然,这对安全问题和问题以及其他问题都是开放的,您可能应该研究 PDO 和 MySQLi。

最后一点,在 PHP 中以正确的方式设置密码总是好的:如何在 PHP 中使用 bcrypt 对密码进行哈希处理?

于 2012-09-26T08:13:23.503 回答
1

在您的代码中,您查询所有已知用户,并检查每个用户(如果用户名和密码相同)。这是不必要的慢,不需要从数据库中获取所有用户,只需搜索具有给定用户名的用户即可。

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

然后我建议切换到 mysqli 或 PDO,而不是 mysql_* 函数。不推荐使用 mysql 函数。

于 2012-09-26T08:14:33.710 回答
1

您从代码中得到的输出很明显。你正在做的是:

  1. 从用户表(tblusers)中获取所有记录

    mysql_query("SELECT * FROM tblusers");

  2. 然后你循环每条记录

    而($值= mysql_fetch_array($查询))

因此,如果表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>';             
  }
}   

请注意以下问题:

  • 变量 $userName 和 $userPass 在这里没有被转义,请在你的代码中这样做。你可以看看这里。否则你可能会把自己置于危险之中!
  • 您需要修复else { }块中的标记。
  • 显示的代码/逻辑中还有其他可能的改进。我只是给你的想法!
  • 还看时间,您已将纯文本密码存储在您的数据库中,您不能这样做!至少使用mysql原生的password()函数!
于 2012-09-26T08:21:55.643 回答
0
<html>

<h1 align="center">LOGIN PAGE</h1>
<br>
<?php
if(isset($_POST['submit']))
{
$uname=$_POST['$uname'];
$pname=$_POST['$pname'];
echo $uname;
}
?>
<body>
<form action="nexts.php" method="GET">
<table border=1 align=center>
<tr>
<th>USERNAME<th>
<input type="text" name="uname">
</tr>
<tr>
<th>PASSWORD<th>
<input type="password" name="pname">
<br>
<input type="submit" name="submit" value="submit">
</tr>
</html>`<html>

<h1 align="center">LOGIN PAGE</h1>
<br>
<?php
if(isset($_POST['submit']))
{
$uname=$_POST['$uname'];
$pname=$_POST['$pname'];
echo $uname;
}
?>
<body>
<form action="nexts.php" method="GET">
<table border=1 align=center>
<tr>
<th>USERNAME<th>
<input type="text" name="uname">
</tr>
<tr>
<th>PASSWORD<th>
<input type="password" name="pname">
<br>
<input type="submit" name="submit" value="submit">
</tr>
</html>

------------------------------------------------

nexts.php
----------------------------

<?php
include_once('connections.php');
?>

<?php

if(isset($_GET['submit']))
{

$uname = $_GET['uname'];
$pname = $_GET['pname'];


$query = mysql_query("SELECT * FROM dayz");
while($value= mysql_fetch_array($query))
{ 
$varuname = $value['uname'];
$varpname = $value['pname'];

if($varuname == $uname && $varpname == $pname)
{
echo "login successful";
}
else if($varuname != $uname && $varpname == $pname) 
{
echo "Invalide username or password, please check again!";             
}
}
}     

?>
于 2014-06-22T11:12:37.813 回答