session_set_save_handler() 带会话超时



我目前有一个包含session_set_saver_handler它工作正常的类。但是,我想实现会话超时,这会导致比最初预期的更多的问题。

据我所知,会话生命周期如下;

  • 打开
  • 关闭

然后调用session_destroy()将运行_destroy()这将运行我设置的配置。

该类直接写入数据库以存储我的会话。数据库包含以下列;

    会话
  • ;包含会话 ID
  • 数据;包含会话的数据
  • 更新时间;包含会话的最后一个活动
  • 锁;默认值为假。但是,如果$variable

所以,目前我有以下内容;

public function _read($id) 
    {
        $timeout = time() - 30;
        $this->database->query('SELECT updatedTime, data FROM sessions WHERE session = :id');
        $this->database->bind(':id', $id); 
        if($this->database->execute())
        {
            if($this->database->rowCount() > 0)
            {
                $row = $this->database->singleResult();
                if($row['updatedTime'] < $timeout)
                {
                    session_unset();
                    session_destroy(); 
                    return; 
                }
                return $row['data']; 
            }
        }
        return '';
    }
public function _destroy($id) 
    {
        $locked = true; 
        $this->database->query('UPDATE sessions SET locked = :locked WHERE session = :id');
        $this->database->bind(':locked', $locked); 
        $this->database->bind(':id', $id); 
        if($this->database->execute())
        {
            return true; 
        } 
        return false;
    }

当条件为真($row['updatedTime'] < $timeout(时,它会运行session_destroy但是因为它依赖于传递给类的数据库对象,所以在运行时session_destroy被销毁,这意味着没有活动的数据库连接。好吧,据我所知,这是正在发生的事情。我可能完全理解了这一点。

30 秒超时仅用于测试目的。好的,所以我所追求的是,当会话的最后一个活动超过当前设置的超时时,它需要销毁会话并将locked列设置为 true .

谢谢!

你不需要在那里打电话给session_destroy()。如果会话已过期,只需拨打header('Location: logout.php')或您想要发生的任何其他操作。在您的logout.php文件中调用session_destroy();并重定向到登录页面。

要在过期会话后进行清理,您需要定义垃圾收集功能(session_set_save_handler中的第六个参数(,您将在销毁函数中执行当前会话所做的所有操作,但仅选择过期的会话。

此外,我只会删除该会话的记录,而不是将其设置为"锁定" - 您将永远不会回到该会话,对吗?

此外,在_destroy函数中,您可以删除会话cookie:

if(isset($_COOKIE['PHPSESSID'])){
    setcookie("PHPSESSID",$_COOKIE['PHPSESSID'],time() - 100000,"/");
}

要防止会话固定攻击(用户重复使用相同的会话 ID,或窃取该 ID 并将其放入其会话 cookie 中(,请在用户登录后立即调用session_regenerate_id(true);

相关内容

  • 没有找到相关文章

最新更新