会话与 cookie 检测用户是否登录


Session vs cookies on detecting user is login or not

如何在注册和登录阶段使用cookie?

用户登录 -> 我使用他们的 id 设置为cookie ->他们关闭浏览器 ->然后当他们回来时,主页会检测是否有cookie ->如果是,请重新登录用户。

这听起来不对,因为我也需要将用户名和密码存储为 cookie?

选择session而不是cookies

这是一个简单的插图。

<?php
session_start();
if(!isset($_SESSION['user']))
{
echo "Hi this is your first time. Enjoy the stay";
$_SESSION['user']='set';
}
else
{
echo "Thanks for coming back";
}

Cookie存储在客户的机器上,可以轻松操作。因此,请使用会话。对于"记住我"功能,您应该将令牌存储在 cookie 中,并在用户每次使用它登录时使其失效。此外,请确保设置合理的到期时间。

互联网上有很多关于此的资源。请记住,即使这种方式也不是绝对防弹的,许多网站会要求您重新输入密码才能执行极其重要的操作(例如更改登录凭据、信用卡号等)。您永远不应该完全信任使用 cookie 进行身份验证的用户。

例如,您可以让他看到的东西,就好像他正常登录一样,但不要让他在没有重新确认旧密码/电子邮件的情况下更改密码/电子邮件。

Cookie 不安全,主要原因之一是到期日期是在您的系统日期计算的。

验证用户的凭据后,使用此代码对用户进行身份验证

$_SESSION['created'] = time();
$_SESSION['last_activity'] = time();

为网站中的每个页面调用以下代码。这将在 $session_expire 秒后自动使会话过期,并保护您免受会话固定攻击

$session_expire = 3600;
// Check if user is online
if(isset($_SESSION['created']) && $_SESSION['created']) {
    // If the last request has been done before 'session_expire' seconds ago, we've to destroy this SESSION
    if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > $session_expire)) {
        // logout the user          
        session_unset();
        session_destroy();
    } else {
        // Update the last activity timestamp
        $_SESSION['last_activity'] = time();
        // Prevention from session fixation attacks
        if (time() - $_SESSION['created'] > $session_expire) {
            // Regenerating session_id
            session_regenerate_id(true);
            // Updating creation time
            $_SESSION['created'] = time();
        }
    }
}