PHP 会话 登录 记住我

2022-08-30 16:38:15

我得到了一个使用PHP会话的PHP注册/登录系统,该系统运行良好,我希望用户能够勾选记住我,然后他们永远保持登录状态或至少一周左右。

我猜我需要存储一个cookie并检查,我对我实际需要存储在cookie中的内容感到困惑。如果我存储了用户ID或用户名,那么有人不能使用虚假的cookie来查看其他用户的数据吗?

任何进展都是值得赞赏的。


答案 1

您需要做的就是扩展PHP会话cookie。以下示例将 Cookie 延长 30 天:

$params = session_get_cookie_params();
setcookie(session_name(), $_COOKIE[session_name()], time() + 60*60*24*30, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);

我认为通过您的安全问题,您只是关心放置容易被黑客入侵的值。PHP会话cookie具有随机值,并将其内容存储在文件系统上,因此您应该没问题。


答案 2

成功登录后,请执行以下操作:

$_SESSION['user_is_loggedin'] = 1;

$cookiehash = md5(sha1(username . user_ip));
setcookie("uname",$cookiehash,time()+3600*24*365,'/','.yoursite.com');

存储在 sql 中:

$sql = "UPDATE `users` SET `login_session`='$cookiehash' WHERE `user_id`='$uid'";

以检查用户是否已登录:

function CheckCookieLogin() {
    $uname = $_COOKIE['uname']; 
    if (!empty($uname)) {   
        $sql = "SELECT * FROM `users` WHERE `login_session`='$uname'";
        $_SESSION['user_is_loggedin'] = 1;
        $_SESSION['cookie'] = $uname;
        // reset expiry date
        setcookie("uname",$uname,time()+3600*24*365,'/','.yoursite.com');
    }
}

if(!isset($_SESSION['cookie']) && empty($_SESSION['user_is_loggedin'])) {
    CheckCookieLogin();
}

推荐