我是饼干和(实际上是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)并且会话不够好。我还听说,给予会话很长一段时间并不能保证删除它们。
关于安全性:我的网站不需要超级超级安全,我认为这个令牌就足够了吗?
答案 0 :(得分:1)
我将会话用于安全部分,并在cookie中使用hash或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']);