PHP中的持久会话

时间:2011-10-04 02:08:01

标签: php security cookies

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

此处是我的代码:

// 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();
}

我遇到的问题是因为s​​etcookie()在后续页面之后才生效,所以$ guid的值被添加到数据库之间会断开连接(在此页面上触发)以及添加到cookie中的内容。例如,如果我登录然后只是打印$ _SESSION ['mb_session']和$ _COOKIE ['mb_session']的值,我会得到两个不同的GUID - 如果我第二次登录,$ _SESSION ['mb_sesison'获取一个新值,$ _COOKIE ['mb_session']获取上一次运行的GUID。

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

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

1 个答案:

答案 0 :(得分:1)

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