原谅可怜的头衔...
我正在尝试为登录脚本编写基本表单。用户输入用户名和密码并按“登录”。分配给表单的操作只是刷新同一页面。该页面包含检查$ _POST中的用户名和密码的代码,如果它们在那里,则检查凭据,创建会话ID并设置cookie。如果登录成功,则不再显示页面的登录部分。
我遇到的问题是,在我登录后,似乎cookie没有得到足够快的写入,因为随后从该cookie读取失败。但是,如果我立即手动刷新页面,它实际上已成功登录。
// Login function, MD5 hashing would be replaced with something better
// if this were something mission critical, but as it stands I'm only
// using this as a learning tool
function login($username, $password)
{
$username = addslashes($username);
$password = md5($password);
$query = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password'");
if(mysql_num_rows($query) == 1)
{
$info = mysql_fetch_array($query);
$userid = $info[uid];
$sessionid = md5($userid . time());
$time = time();
setcookie ("testcookie", $sessionid, $time+3600, '/', '');
mysql_query("DELETE FROM sessions WHERE uid='$userid'");
mysql_query("INSERT INTO sessions (sessionid,uid,timestamp) VALUES('$sessionid','$userid','$time')");
return $userid;
}
else
{
return 0;
}
}
// Check the cookie and return the userid
function status()
{
$sessionid = $_COOKIE[nojunkcontest];
$oldtime = time() - 3600;
$query = mysql_query("SELECT * FROM sessions WHERE sessionid='$sessionid' AND timestamp>$oldtime");
if(mysql_num_rows($query) == 1)
{
$info = mysql_fetch_array($query);
return $info[uid];
}
return 0;
}
// Check whether to attempt login, get userid either way
if($_POST[username] !='' || $_POST[password] != '')
{
$login_status = login($_POST[username], $_POST[password]);
}
else if($_GET[logout])
{
logout();
}
unset($userid);
$userid = status();
// This is in the body of the document...
<?php
if($userid > 0)
{
echo "Logged in (<a href='?logout=1'>Logout</a>)";
}
else
{
if($login_status != '' && $login_status == 0)
{
echo "Invalid username/password combo.<br>";
}
?>
<form action = 'index.php' method ='post'>
<table border = '0' cellspacing = '5'>
<tr>
<td>Username</td>
<td><input type = 'text' name = 'username'></td>
<td>Password</td>
<td><input type = 'password' name = 'password'></td>
<td><input type = 'submit' name = 'submit' value = 'Login'></td>
</tr>
</table>
</form>
正如您所看到的,表单操作是“index.php”,它与所有此代码所在的页面相同,因此它只是执行刷新。 status()函数虽然在此刷新时返回0,但如果我之后手动刷新,它会成功,这使我相信它是$ _COOKIE调用失败。我没有包含的login()函数写入status()读取的cookie。所以一切都在那个部门工作,这只是令人讨厌的令人烦恼的事情,我无法弄明白。
任何帮助都将不胜感激,谢谢。
答案 0 :(得分:0)
正如你所说的那样,你只是在尝试而且它不一定是安全的:
您的Cookie存在的问题是在执行之后设置了Cookie,并且已完成向用户的传递。这就是为什么在相同的脚本中设置cookie之后,你无法读取几行。
但正如评论中的其他人已经建议的那样,永远不要使用cookie,请使用会话。