PHP检查密码脚本不会为多个用户工作
我想创建一个简单的登录凭证检查器(使用会话变量)。PHP检查密码脚本不会为多个用户工作
这是我到目前为止有:
<?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表中有一个以上的用户在它的列表中,检查中断。只有表中最后输入的用户已授予访问权限。输入的最后一位用户之上的任何人都会被碰到不正确的登录屏幕 - 即使凭据正确。为什么发生这种情况?任何人都可以提出一个代码修复或更好的代码来实现这个登录检查?
编辑:评论代码测试以查看提供的凭据是否与记录中的凭据相匹配。该脚本的那部分工作正常。
问题解决了!谢谢你们。对于将来看到这个的任何人,绝对要加密你的密码,我的是纯文本,因为这是一个本地测试应用程序,甚至不会看到上传到网络。
没有必要遍历所有的用户记录。试想一下,如果您的数据库拥有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
}
从技术上说,他正在循环播放每一条记录,除非他想要进行身份验证的记录是最后一条记录,否则它会中断。所以他要么退出循环时,他想要在数据库中认证的用户名(坏主意)或具体与查询(好主意)。 – Blake 2012-04-22 02:46:17
首先,以纯文本的形式不存储密码!改为使用md5/sha1散列。
其次,这不是获取数据库中所有用户列表的好主意。您在SQL查询中的WHERE子句 - 这也将解决您的问题。
不要忘记盐! – lynks 2012-04-22 02:48:14
是的,感谢纠正我;) – 2012-04-22 03:12:28
您应该检查特定用户的登录详细信息。
$query = mysql_query("SELECT valid_username, valid_password FROM notes_users WHERE valid_password = '$p_word' && valid_username = '$u_name' ");
这将返回唯一一个要检查的行。
为什么不直接查询用户的凭证?例如:
$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 */
哦,为什么你不使用===运算符进行字符串比较?看看它,它更实用。
这是糟糕的代码,
$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'");
这是不好格式。 – Blake 2012-04-22 02:48:14
请格式化代码以便于理解 – 2012-04-22 02:51:04
我是新手,在stackoverflow.Ok,对不起。我会改进它。 – 2012-04-22 02:59:29
不要将密码存放在纯文本。 – SLaks 2012-04-22 02:42:52
使用用户名进行查询。数据库就是为这种事情而精确优化的 - 使用它! – lynks 2012-04-22 02:45:23