Проверка по идентификатору, если сеанс существует, без продления времени жизни сеанса - PullRequest
3 голосов
/ 04 июня 2010

Я работаю в РИА. Мы используем Memcached для хранения сессий, и я установил http://pecl.php.net/package/memcache, и мой обработчик PHP-сессий выглядит так:

$session_save_path = "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10,  ,tcp://$host:$port  ";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);

Время ожидания сеанса установлено на 30 минут. В моей RIA я хочу периодически вызывать серверный скрипт через AJAX, чтобы проверить, жив ли сеанс посетителя. Если вызов ajax возвращает false, я затемню экран и показываю довольно красивое окно для продолжения сеанса.

Теперь проблема в серверном скрипте. Мне нужно определить, существует ли сеанс без продления времени существования сеанса, если он существует.

Я не совсем осведомлен о работе обработчика сеанса, но я уверен, что сделаю это:

<?
session_start();
if($_SESSION['loggedin'] == "yes")
    echo "true";
else 
    echo "false";
?>

Я почти уверен, что это продлит срок жизни сеанса (на стороне сервера, но также и на стороне клиента, отправив новый файл cookie клиенту). И сеанс будет существовать неопределенно долго.

Некоторые варианты я рассмотрел, но исключил:

  • Не выполняйте никаких серверных вызовов, но используйте таймер JavaScript на клиенте (истекает через 30 минут, например). Это не будет работать, когда пользователь имеет RIA, открытый в нескольких окнах
  • Попробуйте взломать session_start (), чтобы предотвратить отправку нового свежего куки клиенту. Это может работать на стороне клиента, но время истечения все равно будет обновляться при внутренней обработке session_handling.

Мне бы хотелось кое-какую идею, Т.и.а.

Ответы [ 2 ]

1 голос
/ 04 июня 2010

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

На самом деле я бы посоветовал вам обернуть эту функциональность в простой класс и сделать что-то вроде этого:

$acl->logIn($username); //set the user as logged in
$acl->isLoggedIn($username); //Is he still logged in?

и т. Д. И т. П.

0 голосов
/ 04 июня 2010

Не проверяйте пользователей только с помощью Javascript. Вы просто спрашиваете о некоторых серьезных проблемах безопасности.

Ваш первый метод проверки Ajax на $ _SESSION ['loggedin'] будет работать - если истек срок их предыдущей сессии, он будет генерировать новый идентификатор сессии перед продолжением, и поэтому $ _SESSION ['loggedin'] не будет установлен .

...