【问题标题】:Is this the correct way to reconstitute a given user's session?这是重构给定用户会话的正确方法吗?
【发布时间】:2011-12-30 20:23:23
【问题描述】:

我的功能如下:

 $sid = mysql_real_escape_string( $_COOKIE['session_id'] );
if( $sid ) { session_id( $sid ); }

// Start session
if( !session_start() ) { die( 'Session could not be started.' ); }
$sid = session_id();

// Validate session id
 $user = $this->validateSessionId( $sid );

if( $user ) {
    if( !$user['uid'] ) {
        trigger_error( '`Services->__construct()` - Could not find user by session id \''.(string)$sid.'\'.',
                E_USER_ERROR );
    }

    $_SESSION['uid'] = $user['uid'];
    $_SESSION['user_name'] = $user['name'];
    $_SESSION['user_email'] = $user['email'];
    $_SESSION['user_created'] = $user['created'];
}

// If no valid session id, user is anonymous
else {
    $_SESSION['user_name'] = 'Anonymous';
    $_SESSION['user_created'] = time();
}

当用户首次登录时,系统会为他们创建一个名为 session_id 的 cookie,其中包含他们当前会话的 ID。此 id 也被添加到数据库表中。我的理解是会话最终在客户端和服务器上都会过期,但是可以将 cookie 和数据库条目设置为持续多久。

validateSessionId 检查数据库中的会话 ID 表。如果找到会话,并且上次访问时间超过 30 天(如果是,则从表中删除),用户列表中的关联数组表示与该会话 ID 关联的用户。然后将该用户的数据加载到当前会话中。

我是否正确理解了它的工作原理?

【问题讨论】:

    标签: php mysql session session-cookies


    【解决方案1】:

    可以避免整个session_id() 业务。当您调用 session_start() 时,PHP 将自动检查会话 cookie 的存在,并在那时检索会话的 ID。你只是在复制已经为你做的事情。

    您的代码假定 PHP 发送出去以跟踪会话的 cookie 实际上是一个永久 cookie。通常 PHP 只发送一个会话 cookie(例如,当浏览器关闭时删除)。因此,用户在返回网站时不会拥有任何会话 cookie,并且每次都会获得一个全新的会话。

    【讨论】:

    • 哦,抱歉,我应该提到 cookie 值 session_id 在首次登录时存储,并且在用户会话到期后重建会话所必需的。
    • 是的,但是如果客户端浏览器忘记了那个 cookie,您最终会在数据库中得到一个孤立会话记录。用户会进来,没有 cookie,所以 session_start() 将创建一个新的会话 ID。
    • 嗯。解决方案是在该用户再次登录时删除表中的所有会话条目吗?无论如何,如果没有该会话 cookie,他们将不得不再次登录...
    • 我想您可以让您的登录代码检查用户是否有过时的会话并将其删除或将这些过时的会话数据复制到新会话中。取决于您的需求/想要什么。
    • 如果用户再次登录,使旧会话无效可能更安全(?)。如果他们想在多台机器上使用给定帐户,那可能会很痛苦,但是...
    猜你喜欢
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2010-09-16
    相关资源
    最近更新 更多