2011-10-04 142 views
1

我有一个需要持久cookie的应用程序,我正在尽我所能地遵循最佳实践(如The definitive guide to form-based website authentication),但遇到了我一直未遇到的问题能够追踪解决方案。PHP中的持久会话

这里是我的代码,此刻:

// Valid user 
if ($validuser) { 

    // Initiate the session and remove any existing ones - also create the GUID and hashed 
    session_start(); 
    $guid = uuid(); 
    $hashedguid = $pwdHasher->HashPassword($guid); 
    if (isset($_SESSION['mb_session'])) { 
    unset($_SESSION['mb_session']); 
    } 

    // Look for existing cookie and split the two parts (uuid::email), then empty existing cookie 
    if (isset($_COOKIE['mb_session'])) { 
    $id_vals = explode('::',$_COOKIE['mb_session']); 
    setcookie('mb_session', '', time() - COOKIE_EXP_TIME); 
    // Remove any existing sessions/data 
    $params = array(array('value' => $id_vals[0], 'type' => 's'), array('value' => $user[0], 'type' => 'i')); 
    db_query('DELETE FROM sessions WHERE sid = ? AND uid = ?', $params, false, false); 
    $params = array(array('value' => $id_vals[0], 'type' => 's')); 
    db_query('DELETE FROM sessiondata WHERE sid = ?', $params, false, false); 
    } 

    // If remember me was selected, set the cookie and 30 day expiration 
    if (isset($_POST['remember_me'])) { 
    setcookie('mb_session', $guid . '::' . $_POST['email_address'], time() + COOKIE_EXP_TIME); 
    } 

    // Save session to DB 
    $params = array(array('value' => $guid, 'type' => 's'), array('value' => date('y-m-d H:i:s'), 'type' => 's'), array('value' => $user[0]['uid'], 'type' => 'i')); 
    db_query('INSERT INTO sessions (sid, modified, uid) VALUES (?, ?, ?)', $params, false, false); 

    // Now set the session variable 
    $_SESSION['mb_session'] = $guid; 
    $_SESSION['mb_session_user'] = $user['0']['uid']; 
    $_SESSION['mb_session_modified'] = time(); 
    $_SESSION['mb_session_logged_in'] = true; 
} 
// Invalid user, redirect with error 
else { 
    header('Location: ' . $redir . '?e=5'); 
    exit(); 
} 

,我快到的问题是,由于setcookie()函数不走,直到效果以下页,还有的脱节$ guid的值被添加到数据库(在这个页面上激发)以及添加到cookie中的值。例如,如果我登录,然后只是打印$ _SESSION ['mb_session']和$ _COOKIE ['mb_session']的值,我会得到两个不同的GUID - 如果我第二次登录,$ _SESSION ['mb_sesison' ]得到一个新值,$ _COOKIE ['mb_session']从前​​一次运行中获得GUID。

最终的结果是我无法正确清除并重置用户的Cookie。

我希望这对某人有意义,因为它对我没有多大意义。感谢任何能指引我正确方向的人。

回答

1

无视 - 不知怎的,有一个旧的cookie只是没有从我的浏览器中删除,所以我实际上有两个cookie用于同一个应用程序。清理出那个旧的结合一定程度的修补似乎已经解决了这个问题。