【问题标题】:What is the correct way to set the session duration for continuing it in PHP?设置会话持续时间以在 PHP 中继续的正确方法是什么?
【发布时间】:2013-07-03 10:16:45
【问题描述】:

通常网站会为用户提供记住其登录信息的选项,因此它会在第一次会话开始时将 cookie 生命周期设置为零或 X。

为了记住这个选择,我将生命周期值放在 $_SESSION 变量中。但是当我想继续会话时,我无法在会话开始之前检索此值,如果我想调用 session_set_cookie_params(),我必须在之前进行。

所以目前我在继续会话时调用 session_set_cookie_params()。相反,我存储会话开始时的当前时间,并在会话继续时检查它。这是代码(注意:这是一个简化版本,原始代码包含所有其他需要的东西,如 session_register_shutdown()):

// when I start the session

[...]

session_set_cookie_params($duration); // $duration was set before
session_start();      
$_SESSION['starttime'] = time();
$_SESSION['duration'] = $duration;


//-----------------------------------
// when I continue the session


$ok = true;

session_start();

if (isset($_SESSION['starttime']))
{
    $elapsed = $_SESSION['starttime']; - time();
    $duration = $_SESSION['duration'];
    if ($elapsed >= $duration and $duration !== 0)
    {
        $ok = false;
    }
}
else
{
    $ok = false;
}

if (! $ok)
{
    // destroy the session
}

这是正确的吗?如果不是,为什么以及是否有更智能的方法来处理会话持续时间?

【问题讨论】:

    标签: php session cookies


    【解决方案1】:

    设置 cookie 生命周期不是您唯一需要做的事情,您还必须设置 session.max_lifetime - 名称不正确,实际上是一个 min 生命周期,必须通过在最后一次访问会话文件之后,在允许垃圾收集器从磁盘清理它之前。

    您可能根本不应该为此使用会话机制本身。相反,设置您自己的 cookie,它允许您再次识别登录用户 - f.e.包含用户名或 id,以及使用秘密盐散列的用户独有的东西。如果您收到该 cookie 值(并已对其进行验证)并且您的会话中还没有登录用户 - 登录他们,加载所有必要的数据以放入会话等。

    【讨论】:

    • 好吧,这不回答“为什么” :) 为什么我不应该使用会话机制?
    • 因为 :-) 首先,由于会话文件的生命周期,您将不得不增加(很多)——因此会积累比平时更多的会话文件。然后这些文件中会有很多数据(可能?),当用户在您的页面上不活动时,您不需要将大部分数据存储在那里。
    • 你说得对,我从没想过这一点,但我不能修改垃圾收集器的行为,不删除会话,而只删除会话数据,除了生命周期和启动时间吗?我问这个是因为将 db id 存储在 cookie 中,即使是加密的,在我看来也是不安全的。
    • 会话的工作方式如下:客户端在每个请求中发送会话 id,服务器查看是否找到具有相应名称的会话文件(如果找到,他会再次选择该会话),或者他创建了一个新的会话文件。 GC 是简单地删除该会话文件 - 因此您无法在没有会话文件的情况下保留会话。
    • 至于存储任何类型的用户 id,与任何不安全的东西一起散列 - 不像会话本身那样不安全,因为两者都使用外人无法猜到的“随机”密钥。有问题的只是 cookie 窃取 - 但可以通过在每次用户访问该站点时创建一个带有随机盐的新哈希并将新盐也保存到数据库中来解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2017-06-20
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多