PHP检查密码脚本不适用于多个用户

时间:2012-04-22 02:40:27

标签: php mysql

我正在尝试创建一个简单的登录凭据检查器(带有会话变量)。

这是我到目前为止所做的:

<?php
include("dbconnect.php");
$u_name = mysql_real_escape_string($_POST['uname']);
$p_word = mysql_real_escape_string($_POST['pword']);
# *** querying all records ***
$query = mysql_query("SELECT valid_username, valid_password FROM notes_users");
while($rst = mysql_fetch_array($query)) {

//echo $rst[valid_username] . ", ";
//echo $u_name . " || ";
//echo ($rst[valid_username] == $u_name) . " || ";
//echo $rst[valid_password] . ", ";
//echo $p_word . " || ";
//echo ($rst[valid_password] == $p_word) . " || ";
//echo (($rst[valid_username] == $u_name) AND ($rst[valid_password] == $p_word));
//echo "<br/>";

if (($rst[valid_username] == $u_name) AND ($rst[valid_password] == $p_word)) {
    session_start();
    $_SESSION['login'] = "1";
    header('Location: main.php') ;
} else {
    session_start();
    $_SESSION['login'] = '';
    header('Location: badlogin.php') ;
}


}

?>

这是问题所在:如果MySQL表的列表中有多个用户,则检查会中断。只有表中最后输入的用户才能授予访问权限。即使凭据正确,上次输入的用户之上的任何人都会遇到错误的登录屏幕。为什么会这样?任何人都可以建议代码修复或更好的代码来实现此登录检查吗?

编辑:注释代码测试以查看提供的凭据是否与记录中的凭据匹配。脚本的那部分工作正常。

问题解决了!谢谢你们。对于今后看到这个的人来说,绝对加密你的密码,我的是纯文本,因为这是一个本地测试应用程序,甚至看不到上传到网上。

5 个答案:

答案 0 :(得分:4)

无需遍历所有用户记录。想象一下,如果你有一个拥有1000000个用户的数据库,你只需要尝试获取与提供的用户名和密码相对应的记录。将您的查询更新为以下内容:

$query = mysql_query("SELECT * FROM notes_users 
                      WHERE 
                      valid_password = '$p_word' && 
                      valid_username = '$u_name'");

然后你会做类似的事情:

if (($row = mysql_fetch_array($query)) {
   // valid user
} else {
   // invalid password or username
}

答案 1 :(得分:1)

首先,不要以纯文本形式存储密码!请改用md5 / sha1哈希。

其次,获取数据库中所有用户的列表并不是一个好主意。您在SQL查询中的WHERE子句 - 这也将解决您的问题..

答案 2 :(得分:0)

您应该检查特定用户的登录详细信息。

$query = mysql_query("SELECT valid_username, valid_password FROM notes_users WHERE valid_password = '$p_word' && valid_username = '$u_name' ");

将返回唯一要检查的行。

答案 3 :(得分:0)

为什么不直接查询用户的凭据?例如:

$statement = mysql_query("SELECT valid_username FROM notes_users WHERE \
valid_username = '{$u_name}' and valid_password = '{$p_word}' LIMIT 1;");

if ( mysql_num_rows($statement) > 0 ) { /* log user in */ }
else { /* bad log in */

哦,你为什么不使用===运算符进行字符串比较?调查一下,它更实用。

答案 4 :(得分:0)

这是错误的代码,

$query = mysql_query("SELECT valid_username, valid_password FROM notes_users");

使用以下代码:

$postedUsername=mysql_real_escape_string($_POST['uname']));
$postedPass=mysql_real_escape_string($_POST['pass']));
$query = mysql_query("SELECT valid_username, valid_password FROM notes_users where username='$postedUsername' and password='$postedPass'");