Как ограничить время сессии php
Перейти к содержимому

Как ограничить время сессии php

  • автор:

PHP — работа с сессиями

PHP - работа с сессиями

Здравствуйте, уважаемые читатели блога LifeExample, сегодня хочу затронуть одну несложную тему и в тоже время очень полезную любому PHP проекту. Поговорим о том, как осуществляется работа с сессиями в PHP.

В PHP, работа с сессиями позволяет легко оперировать данными пользователя в период нахождения его на сайте. Это значит, что когда пользователь заходит на ваш сайт, то для него заводится собственное хранилище информации (сессия) на вашем сервере, представляющее собой обычный текстовый файл.

Созданный для пользователя, текстовый файл актуален вплоть до ухода его с сайта, поэтому и называется сессией.

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

Как работать с сессиями PHP

Чтобы создать сессию необходимо в коде формирования страницы, до любого вывода контента, вызвать функцию:

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

Сам идентификатор будет сохранен в куках пользователя в его браузере, обычно в похожем виде:

После того как мы открыли сессию функцией session_start(), мы получаем возможность оперировать суперглобальным массивом $_SESSION, который является неким адаптером для работы с файлами сессий.

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

Пример для работы с сессиями в PHP

В приведенном коде если активен флаг $fillSession, то сессия заполняется определенными данными, заметьте, что типы данных могут быть самыми разнообразными – строки, числа, массивы, значения возвращаемые функциями.

Попробуйте запустить этот код на странице – он не выведет вам ничего. Затем присвойте $fillSession = true и обновите страницу, вы увидите содержание массива $_SESSION.

Теперь верните $fillSession = false, и снова обновите страницу.

Массив наполнился и теперь хранит в себе информацию. Вы даже можете закрыть браузер и снова открыть страницу, как видите — данные сохранились!

Храниться одни будут пока не истечет установленное время сессии или вы лично не уничтожите сессию функцией:

Время жизни сессии в PHP

Время жизни сессии в PHP можно задать несколькими способами:

1. Явно задать количество секунд хранения файлов сессий в коде PHP:

2. Задать значения для директив в php.ini:

3. Использовать файл .htaccess:

Для чего можно использовать сессии

В PHP работа с сессиями часто сопровождается задачей – сохранения данных авторизованного на сайте пользователя. Но помимо этого в сессии можно хранить флаги определенных действий, которые совершил или не совершил пользователь, находясь на вашем сайте, например:

  • Авторизовался;
  • Побывал на конкретной странице;
  • Ничего не делал в течение какого-либо периода времени;
  • Уже посмотрел всплывающее окно с рекламой;

Также сессия подходит для хранения информации пользователя, например:

  • Имя, фамилия, отчество;
  • Корзина покупателя;
  • Реферальный хост, откуда пришел пользователь;
  • Временные данные;

Опасные моменты

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

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

Перечень всех функций для работы с сессиями

Изучив следующие стандартные методы php, работа с сессиями… будет вам в радость :-). Шучу, на самом деле следующий список приведен только ради полноты информации, но по большому счету кроме session_start(); и session_destroy(); вам редко что-то понадобится.

В данной статье “php работа с сессиями” я попробовал познакомить вас с основами программирования и привел практический пример. Надеюсь вам было понятно. ��

Читайте также похожие статьи:

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Настройка времени сессий в PHP

От времени действия сессии зависит период работоспособности PHP-переменных $_SESSION, и как следствие, активности веб-приложений. Например, если пользователь авторизовался в системе, время в течении которого он может бездействовать без необходимости повторного ввода логина и пароля зависит от данного параметра.

Существуют разные способы установки времени жизни сессий. Попробуем разобраться на примере операционной системы Linux.

Как узнать время жизни сессии

Перед настройкой, стоит посмотреть текущее состояние. Есть несколько методов это сделать:

1. На сервере командой php

php -i | grep session

Получаем список параметров, имеющих отношение к сессиям. Нас интересуют:

  • session.cookie_lifetime => 0 => 0
  • session.gc_maxlifetime => 1440 => 1440

Данные значения — значение по умолчанию. cookie_lifetime => 0 говорит о действии файлов куки до закрытия браузера, если задать этому параметру определенное значение, сессия будет прерываться при активном сеансе, поэтому лучше ее оставлять в значении ноль.

2. C помощью php-функции ini_get

$maxlifetime = ini_get("session.gc_maxlifetime");
$cookielifetime = ini_get("session.cookie_lifetime");

echo $maxlifetime;
echo $cookielifetime;

Настройка сессий на веб-сервере

Выполняется путем настройки файла php.ini. Данный способ удобен, если мы являемся администратором веб-сервера, а также если есть гарантия, что общая настройка сессий не повлияет на работоспособность всех веб-приложений, работающих на данном сервере.

Открываем на редактирование php.ini. Его расположение зависит от сборки Linux. Точный путь можно посмотреть командой:

php -i | grep php.ini

Теперь открываем сам файл:

* в моем случае каманда php -i | grep php.ini вернула данный путь.

В некоторых системах, например, Ubuntu или Debian для каждой среды обработки кода создается свой php.ini файл, а также для каждой версии PHP. Например, по пути /etc/php/7.4/fpm/php.ini находится файл для php-fpm для PHP версии 7.4. Нам необходимо учитывать данный факт, чтобы настроить нужный файл.

И редактируем следующие параметры:

session.gc_maxlifetime = 86400
session.cookie_lifetime = 0

* где параметр gc_maxlifetime указывает на временя в секундах, после прошествии которого данные могут быть удалены; cookie_lifetime — время жизни файлов cookies; 86400 — 24 часа в секундах.
* если параметру gc_maxlifetime задать значение 0, действие сессий будет бесконечным. Это, как правило, не стоит делать — приведет к падению производительности и безопасности сервера.

После настройки параметров, необходимо перезагрузить сервер, являющийся интерпретатором PHP.

systemctl restart apache2 || systemctl restart httpd

* в версиях Linux без systemd используем команду service apache2 restart или service httpd restart.

Если используем FastCGI (PHP-FPM).

systemctl restart php-fpm

б) для Ubuntu или Debian:

systemctl restart php7.4-fpm

* где 7.4 — версия используемого PHP.

Настройка через файл .htaccess

Данный файл позволяет веб-мастеру управлять некоторыми настройками веб-сервера. Для его редактирования нужен доступ к файлам сайта. Способ не сработает, если в качестве обработчика PHP используется не Apache, а, например, NGINX + PHP-FPM. Хотя, тут тоже есть способ (о нем будет ниже).

В файл .htaccess вносим следующее:

php_value session.gc_maxlifetime 86400
php_value session.cookie_lifetime 0

* как можно заметить, параметры те же, что при настройки через php.ini.

Как говорилось выше, метод не сработает, если не используется Apache. Однако настройку можно выполнить на сервере (опять же, у нас должен быть соответствующий доступ).

Открываем файл настройки веб-сервера, например, в php-fpm:

php_value[session.gc_maxlifetime] = 86400
php_value[session.cookie_lifetime] = 0

После перезапускаем сервис:

systemctl restart php-fpm || service php-fpm restart

Задание параметра в коде приложения

Способ может быть полезен, когда разные страницы портала должны иметь разное время жизни сессии. Для этого можно воспользоваться PHP-функциями ini_set и session_set_cookie_params, например:

ini_set('session.gc_maxlifetime', 86400);
ini_set('session.cookie_lifetime', 0);
session_set_cookie_params(0);

Функции обязательно вызывать до открытия сесии (session_start).

Установка сессии в приложении

Некоторые приложения могут переопределять настройки. В таком случае, задать время жизни сессии необходимо в параметрах программы. У каждого приложения свои настройки, в которых необходимо самостоятельно разобраться. Приведем для примера настройку сессии в CMS Битрикс.

Заходим в Группы пользователей — выбираем группу — Безопасность. Находим параметр «Время жизни сессии (минут)» и ставим время, например 1440 (24 часа в минутах).

Как автоматически продлевать сессии

Если сессия выдается на определенный период и заканчивается в определенное время, это может привести к прерыванию активного сеанса пользователя. Гораздо удобнее, если время действия сессии будет автоматически продлеваться, если посетитель обновляет страницу. Для этого существует параметр cookie_lifetime, который во всех примерах выше мы задавали в значении 0.

Если мы зададим значение cookie_lifetime 86400, то через 24 часа сессия прервется. Это не всегда удобно.

Если есть необходимость в контроле и прерывании сессии, можно воспользоваться php-функцией session_destroy().

Путь хранения файлов сессий

Место хранения файлов сессий задается параметром session.save_path также, так время жизни. По умолчанию, может использоваться путь /var/lib/php/sessions.

Это важный параметр — если у веб-сервера будут отсутствовать права на запись в данный каталог, это приведет к невозможности хранить сессии, что вызовет неожиданные результаты работы приложений.

Защита идентификатора сессий в PHP

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

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

После аутентификации пользователя, веб-сервер предоставляет ему идентификатор сессии. Этот идентификатор хранится в браузере и подставляется всякий раз, когда нужна проверка подлинности. Это позволяет избежать повторяющихся процессов ввода логина/пароля. Все это происходит в фоновом режиме и не доставляет дискомфорта пользователю. Представьте, если бы вы вводили имя и пароль каждый раз, когда просматривали новую страницу!

В данной статье я постараюсь изложить все известные мне способы защиты идентификатора сессии в PHP.

Использование cookie

По умолчанию вся информация о сессии, включая ID, передается в cookie. Но так бывает не всегда. Некоторые пользователи отключают cookie в своих браузерах. В таком случае браузер будет передавать идентификатор сессии в URL.

Здесь ID передается в открытом виде, в отличие от сессии через cookie, когда информация скрыта в HTTP-заголовке. Самым простым способом защиты от этого будет запрет передачи идентификатора сессии через адресную строку. Сделать это можно, прописав следующее в конфигурационном файле Apache-сервера .htaccess:

php_flag session.use_only_cookies on

Использование шифрования

Если на вашем сайте должна обрабатываться конфиденциальная информация, такая как номера кредитных карт (привет от Sony), следует использовать SSL3.0 или TSL1.0 шифрование. Для этого при установке cookie следует указывать true для параметра secure.

Если вы храните пароль сессии в переменной $_SESSION (все-таки лучше использовать sql), то не стоит хранить его в открытом виде.

Приведенный выше код не безопасный, так как пароль хранится в виде обычного текста в переменной сессии. Вместо этого используйте md5-шифрование, примерно так:

Проверка браузера

Чтобы отсечь возможность использования сессии с другого браузера (компьютера), следует ввести проверку поля HTTP-заголовка user-agent:

Срок действия сессии

Ограничьте время жизни сессии, а также время действия cookie. По умолчанию срок действия сессии 1440 секунд. Изменить это значение можно через php.ini и .htaccess. Пример для .htaccess:

# Время жизни сессии в секундах
php_value session.gc_maxlifetime 3600
# Время жизни куки в секундах
php_value session.cookie_lifetime 3600

Привязка по IP-адресу

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

либо по IP-адресу для каждого запроса (только для статичных IP):

Следует осознавать, что полностью избежать взлома невозможно. Можно только максимально усложнить этот взлом любыми известными способами. Однако следует также не забывать о своих легальных пользователях, чтобы не осложнить им жизнь такой защитой.

How do I expire a PHP session after 30 minutes?

I need to keep a session alive for 30 minutes and then destroy it.

17 Answers 17

You should implement a session timeout of your own. Both options mentioned by others (session.gc_maxlifetime and session.cookie_lifetime) are not reliable. I’ll explain the reasons for that.

First:

session.gc_maxlifetime
session.gc_maxlifetime specifies the number of seconds after which data will be seen as ‘garbage’ and cleaned up. Garbage collection occurs during session start.

But the garbage collector is only started with a probability of session.gc_probability divided by session.gc_divisor. And using the default values for those options (1 and 100 respectively), the chance is only at 1%.

Well, you could simply adjust these values so that the garbage collector is started more often. But when the garbage collector is started, it will check the validity for every registered session. And that is cost-intensive.

Furthermore, when using PHP’s default session.save_handler files, the session data is stored in files in a path specified in session.save_path. With that session handler, the age of the session data is calculated on the file’s last modification date and not the last access date:

Note: If you are using the default file-based session handler, your filesystem must keep track of access times (atime). Windows FAT does not so you will have to come up with another way to handle garbage collecting your session if you are stuck with a FAT filesystem or any other filesystem where atime tracking is not available. Since PHP 4.2.3 it has used mtime (modified date) instead of atime. So, you won’t have problems with filesystems where atime tracking is not available.

So it additionally might occur that a session data file is deleted while the session itself is still considered as valid because the session data was not updated recently.

And second:

session.cookie_lifetime
session.cookie_lifetime specifies the lifetime of the cookie in seconds which is sent to the browser. […]

Yes, that’s right. This only affects the cookie lifetime and the session itself may still be valid. But it’s the server’s task to invalidate a session, not the client. So this doesn’t help anything. In fact, having session.cookie_lifetime set to 0 would make the session’s cookie a real session cookie that is only valid until the browser is closed.

Conclusion / best solution:

The best solution is to implement a session timeout of your own. Use a simple time stamp that denotes the time of the last activity (i.e. request) and update it with every request:

Updating the session data with every request also changes the session file’s modification date so that the session is not removed by the garbage collector prematurely.

You can also use an additional time stamp to regenerate the session ID periodically to avoid attacks on sessions like session fixation:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *