使用PHP登录时比较用户名和密码
假设我有如下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
<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))
因此,如果tabletblusers
有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))
因此,如果tabletblusers
有1000条记录,您将收到1000次消息
你应该