1

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

这是我到目前为止所拥有的:

<?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 表的列表中有多个用户,则检查会中断。只有表中最后输入的用户才有权访问。最后输入的用户上方的任何人都会被撞到不正确的登录屏幕 - 即使凭据是正确的。为什么会这样?任何人都可以建议一个代码修复或更好的代码来实现这个登录检查吗?

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

问题解决了!谢谢你们。对于将来看到此内容的任何人,请务必加密您的密码,我的密码是纯文本,因为这是一个本地测试应用程序,甚至不会看到上传到网络。

4

5 回答 5

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
}
于 2012-04-22T02:44:56.697 回答
1

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

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

于 2012-04-22T02:45:40.147 回答
0

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

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

这将返回唯一要检查的一行。

于 2012-04-22T02:47:27.230 回答
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 */

哦,为什么不使用 === 运算符进行字符串比较?看了一下,比较实用。

于 2012-04-22T02:47:31.193 回答
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'");
于 2012-04-22T02:47:51.323 回答