【问题标题】:PHP Form/Cookies, need to refresh page to see changesPHP Form/Cookies,需要刷新页面才能看到变化
【发布时间】:2012-05-12 05:18:25
【问题描述】:

请原谅这个可怜的标题...

我正在尝试为登录脚本编写一个基本表单。用户输入用户名和密码并按下“登录”。分配给表单的操作只是刷新同一页面。该页面具有检查 $_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。所以那个部门的一切都在工作,只是这个烦人的刷新事情我想不通。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • login() 函数长什么样子?
  • 脚本不安全:不要使用会话 ID 来检查是否登录。我建议使用访问者 ip 创建哈希并将其插入会话表中。在这一行 if($_POST[username] !='' || $_POST[password] != '') 你必须替换 ||与 && 和:替换 if($login_status != '' && $login_status == 0) 为 if($login_status == 0)
  • Cookie 值可以由用户操作,因此这段代码容易受到 SQL 注入的攻击。您真的应该使用准备好的语句,其中您将变量作为未针对 SQL 进行评估的参数传递。如果你不知道我在说什么,或者如何解决它,请阅读Bobby Tables 的故事。
  • 感谢您的建议。目前,它的安全性并不重要,因为我只是在试验和尝试学习,并没有真正构建任何真正有用的东西,但我会考虑以任何一种方式修复漏洞。
  • 我在原帖中添加了 login() 函数,谢谢大家。

标签: php mysql html cookies


【解决方案1】:

正如你所说,你只是在试验,它不一定是安全的:

您的 cookie 的问题在于 cookie 是在 执行之后设置的,并且完成了向用户的交付。这就是为什么在同一个脚本中设置好几行后无法读取 cookie 的原因。

但正如 cmets 中的其他人已经建议的那样,永远不要为此使用 cookie,使用会话。

【讨论】:

  • 谢谢你说得非常有道理,我很感激!
猜你喜欢
  • 1970-01-01
  • 2020-08-06
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多