【问题标题】:Remembering and validating user using cookies使用 cookie 记住和验证用户
【发布时间】:2012-03-11 15:47:24
【问题描述】:

我是 cookie 和(实际上一般是 PHP)的新手,我想为我正在开发的网站实现一个“记住我”系统。在这里和其他网站上阅读了很多帖子后,我明白我不应该将密码或用户的任何其他输入放在 cookie 中。一种解决方案是在数据库表中使用remember_key,每次用户登录并选中“记住我”复选框时都会重新生成该表。当用户再次访问该页面时,代码应从数据库中选择remember_key 并检查$_COOKIE['remember'] 是否与remember_key 相同,如果是则用户已登录。但我不确定如何来实现这一点。我以我认为应该的方式编写了一些代码,但是我可以使用一些帮助来查看我已经拥有的内容是否正确以及如何继续。这就是我现在拥有的:

function rememberUser($id) {

    $remember = md5(uniqid(mt_rand(),true));
    $stmt = $mysqli->prepare("UPDATE USERS SET USER_REMEMBER_KEY = ?    WHERE USER_ID = ?");
    $stmt->bind_param('si', $remember, $id);
    $stmt->execute();
    setcookie("remember", $remember, time()+60*60*24*30, "/", "www.someName.com", false, true);
}

function isValidUser($id) {

    $stmt = $mysqli->prepare("SELECT * FROM USERS WHERE USER_REMEMBER_KEY = ? AND USER_ID = ?");
    $stmt->bind_param('si', $_COOKIE['remember'], $id);
    $stmt->execute();

    $stmt->store_result();
    $count = $stmt->num_rows;

    if($count == 1) {
        return true;
    }
    else {
        return false;
    }
}

function forgetUser($id) { // not sure about this method at all!

    setcookie("remember", '', time()-3600, "/", "www.someName.com", false, true);

}

forgetUser() 将删除$_COOKIE['remember'](或它的值?),但它怎么知道它是那个特定人的cookie?我想要关于我现在拥有的代码以及如何改进它的任何评论/建议/提示/提示或其他任何内容。

对于您的信息,我已经了解会话,它们易于使用且更安全(我猜),但我需要让用户保持更长的登录时间(如 FB),而会话还不够好.我还听说延长会话的生命周期并不能保证它们会被删除。

关于安全性:我的网站不需要超级超级安全,我认为仅此令牌就足够了吗?

【问题讨论】:

标签: php session cookies remember-me


【解决方案1】:

我将会话用于安全部分,并在 cookie 中使用哈希或 user_id。 cookie 只能由您的站点访问。因此,除非其他人在同一台计算机上登录,否则如果您有足够长的有效期,cookie 就会坐在那里。因此,下周当他们返回您的站点并读取 cookie 时,您只需使用存储在数据库中的 user_id 或哈希开始(无论您的会话版本是什么)。如果哈希不匹配,用户必须重新登录。

我希望这就是你所追求的。

编辑:

// I can't remember why right now, But I found to delete the cookie properly,
// after setcookie, I had to unset the $_COOKIE also.
setcookie("userid", "", time() - 3600);
unset($_COOKIE['userid']);

【讨论】:

  • 其实你解释的就是我已经知道的cookies。我知道 cookie 存储在用户的 PC 和服务器上的会话。第三种方法是我不确定的。这是删除cookie的正确方法吗?谢谢。
  • 没问题,很高兴看到不是每个人都在没有得到正确答案时生气。
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2017-03-03
  • 2012-08-03
  • 1970-01-01
  • 2012-09-02
  • 2021-07-13
相关资源
最近更新 更多