Постоянные сессии в PHP - PullRequest
1 голос
/ 04 октября 2011

У меня есть приложение, которому нужен постоянный файл cookie, и я стараюсь следовать рекомендациям (например, Полное руководство по аутентификации веб-сайтов на основе форм ), но я запустилв проблему, для которой я не смог найти решение.

Вот мой код, на данный момент:

// 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 Ответ

1 голос
/ 04 октября 2011

Не обращать внимания - каким-то образом был старый файл cookie, который просто не удалялся из моего браузера, поэтому у меня фактически было два файла cookie для одного и того же приложения. Выяснение того, что старый в сочетании с некоторой степенью переделки, похоже, решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...