Как сохранить пользователь вошел на мой сайт с помощью куки-файла php сессии - PullRequest
0 голосов
/ 16 февраля 2011

Первоначально я придумал следующее, чтобы проверить, вошел ли пользователь в систему:

<?php 
  session_start();
  if(!isset($_SESSION['sessionid'])) {
   header("Location: login_form.php");
  } else {
   echo "You are logged in";
  }
?>

$_SESSION['sessionid'] устанавливается, когда пользователь входит в систему вручную.

Если пользователь проверяет «запомни меня», я устанавливаю время жизни cookie сеанса равным 10 годам:

   $lifetime = 24*60*60*365*10; // 10 years
   setcookie(session_name(),session_id(),time()+ $lifetime,'/'); 

Так что теперь мне нужно выяснить, что делать на стороне сервера .... Изначально я думал о том, чтобы установить для session.gc_maxlifetime высокое значение, чтобы данные сеанса сервера сохранялись долгое время, но 10 лет. было бы смешно Теперь я думаю, что я должен сохранить идентификатор сеанса в пользовательской таблице и запросить его по идентификатору сеанса. Если есть совпадение, я автоматически войду в систему.

Мой вопрос: Как получить идентификатор сеанса от клиента?

Насколько я понимаю, он будет доступен после того, как я вызову session_start (), но только если данные сеанса на сервере все еще доступны. Если сеанс истек (что происходит в зависимости от значения session.gc_maxlifetime), новый идентификатор сеанса будет сгенерирован при вызове session_start (). Это было бы проблематично, так как оно не соответствовало бы последнему идентификатору сеанса, который я сохранил в пользовательской таблице.

Итак, после вызова session_start () я должен прочитать идентификатор сессии: 1) $_SESSION['sessionid'] 2) $id = session_id(); 3) $_COOKIE["PHPSESSID"];

1 и 2 не будут работать, если сервер уничтожил данные сеанса, поэтому я не думаю, что смогу их использовать.

3 может работать, но когда я попробовал (echo $_COOKIE["PHPSESSID"];), я был удивлен, потому что идентификатор сеанса появился дважды: вывод был такой:

htknitopug4b6bv4ql9050pfg6 //htknitopug4b6bv4ql9050pfg6

Я просто ожидал, что результат будет htknitopug4b6bv4ql9050pfg6.

Может кто-нибудь объяснить дубликат записи идентификатора сеанса? Если это поведение соответствует, я всегда могу прочитать первую строку в моей таблице базы данных.

1 Ответ

2 голосов
/ 17 февраля 2011

Краткий ответ: вы не должны этого делать.По причинам, почему, пожалуйста, смотрите этот ответ .

Что касается того, что делать вместо этого, я бы установил подписанный cookie (этот пост показывает, как) с большой случайной строкой, уникальной для каждого пользователя.,Затем при загрузке сеанса, если он новый, проверьте наличие cookie.Затем найдите пользователя на основе этой случайной строки.Если вы его найдете, снова войдите в систему.

Это довольно стандартная функция запоминания, но она позволяет избежать проблем, связанных с продолжительными сеансами или использованием идентификатора сеанса для других целей.

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

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