PHP cессии
Введение | |
Для чего используются сессии | |
Где настраивать сессии | |
session.configuration: Конфигурации | |
Функции | |
Пример .htaccess | |
session_start(): Начать сессию | |
Окончание сессии |
Введение
HTTP протокол сам по себе stateless.
Сессии нужны для хранения информации о пользователях. Они используют cookie делают примерно то же что и
cookies
но лишены большинства их
недостатков
Сессии это инструмент для управления состоянием приложения.
Как и $_COOKIE $_SESSION это суперглобальная переменная
(
массив
)
, которая хранится на веб сервере.
У каждой сессии есть уникальный номер Session ID или SID
Сессия должна быть начата до отправки данных браузеру.
Данные на сервере и куки в браузере работают в связке. SID хранится в куки.
Сервер «помнит» пользователя пока работа с сайтом ведётся в сессии.
Сессия удаляется автоматически при закрытии браузера.
рассмотрим эти задачи в следующем параграфе
Что можно сделать с помощью сессий
- Хранить данные о пользователях на сервере. Это безопаснее чем куки. Данные хранятся в файлах или в Базе Данных
- Данные, которые часто используются, можно сохранить в сессии. Тогда обращаться к ним будет быстрее чем к базе данных.
- Хранить неограниченное количество информации. Нет лимита в 4KB как у куки.
- Сессии не отправляют одну и ту же информацию по кругу как куки - меньше размер запроса.
Пример
Из обычной жизни: когда вы получаете счёт за электричество, там содержится много разной информации. Но чтобы оплатить его, нужен только номер счёта. Вводите номер счёта и всё остальное подтянется с сервера.
Пример запроса от клиента
Request 1 GET /homepage.php HTTP/1.1 Host: eth1.ru Accept: */*
Рекомендуется отпрвлять Session ID с сервера в виде куки. Другой вариант: Session ID можно передать в URL параметре.
Response 1 HTTP/1.1 200 OK Content-type: text/html Set-Cookie: SID
Запрос к другой странице будет уже с SID
Request 2 GET /aboutus.php HTTP/1.1 Host: eth1.ru Cookie: SID Accept: */*
Примерно таким образом куки позволяют запоминать пользовательские настройки
Где настраивать сессии
Настроек более 40, способов их задавать тоже несколько.
Первое место, где можно задавать настройки сессий это файл
php.ini
.
С помощью
php.ini
можно изменить настройки для всего PHP сервера.
В Apache можно использовать файл
httpd.conf
для всего сервера и
.htaccess
для отдельных директорий.
Возможно, вы уже пользовались .htaccess для перенаправления запросов
Следующий способ задания настроек - функция ini_set(). Её нужно будет вызывать со всеми скриптами, где используются сессии, поэтому способ не очень эффективный.
Session Configurations Options
Полный список доступен на http://php.net
session.auto_start: автоматически начинает сессию.
По умолчанию выключена.
session.name: задаёт имя текущей сессии и сессионной куки
По умолчанию PHPSESSID.
Может быть изменено с помощью функции
session_name()
session.save_path: путь по которому сохраняется информация о сессии
По умолчанию tmp директория сервера.
session.gc_maxlifetime: максимальное время жизни
По умолчанию 1440 секунд (24 минуты).
session.cookie_lifetime: время жизни куки, которая отправляется браузеру. По сути это значение, которое мы добавляем к time() когда
задаём
expires
По умолчанию 0.
session.cookie_path: задаёт
cookie path
По умолчанию '/'.
session.cookie_secure: задаёт
secure
Если включить то куки будут отправляться только по HTTPS.
По умолчанию выключена.
session.use_strict_mode:
если включить то SID которые созданы не сервером будут отклонены.
По умолчанию выключена.
session.cookie_httponly: задаёт
httponly
Если включить куки будет доступна только по HTTP (и HTTPS). То есть
JavaScript
или
bbscript не смогут получить к куки доступ
По умолчанию выключена.
session.use_cookies: указывает нужно ли сохранять SID в
cookies
на стороне клиента.
По умолчанию включена.
session.use_only_cookies: заставляет сессию использовать
только
cookie
для хранения SID. Работает совместно с session.use_cookies
По умолчанию включена.
session.use_trans_sid: контролирует использование «прозрачных»
SID
Если включить - SID будет добавляться как параметр прямо в URL. Например:
https://www.eth1.ru/?SID
Эту опцию обычно включают только тогда, когда нет поддержки cookies
По умолчанию выключена.
Пользуйтесь trans sid с осторожностью так как это может поставить под угрозу безопасность пользователя.
- Пользователь может отправить URL содержащий активный SID другому человеку по email, irc и т.п.
- URL содержащая активный SID может быть сохранён на публично доступном компьютере.
- - Пользователь может заходить на ваш сайт с одним и тем же SID который он сохранил в закладках или истории браузера.
Подробности на http://php.net/session.use-trans-sid
session.cache_limiter: указывает способ контроля за кэшем во время сессии.
Доступные варианты:
- nocache
- private
- private_no_expire
- public
По умолчанию nocache.
Для сессий с аутентификацией нужно, чтобы кэширование в браузере было отключено.
Подробнее:
http://php.net
http://php.net
session.cookie_samesite: контролирует доступности куки в кроссдоменных запросах.
Доступные варианты: Lax и Strict
Кросдоменные запросы могу быть не только от злоумышленников. Их может делать ваш сайт с разных поддоменов. Либо вы можете следить за перемешением пользователя между своими проектами.
Функции
Полный список доступен на php.net
session_start(): начинает сессию и делает доступной переменную $_SESSION.
session_name(): переименовывает сессию.
Меняет значение, заданное с помощью функции
session.name.
session_id(): получает или устанавливает текущий session id
set new session ID: session_id('<new SID>')
session_destroy(): удаляет всю информацию записанную в сессию
Пример .htaccess
Настройки вашего сервера могут отличаться, это просто пример
# Use php_flag for boolean values, # php_flag session.auto_start off php_flag session.use_cookies on php_flag session.use_only_cookies on php_flag session.use_trans_sid off php_flag session.use_strict_mode on # Use php_value for non-boolean values # Enclose values that contain punctuation in quotes. php_value session.cache_limiter nocache php_value session.cookie_samesite Lax php_value session.name AOSESSID php_value session.save_path ./tmp # Cookie settings php_value session.cookie_path '/' php_value session.cookie_lifetime 0 php_flag session.cookie_httponly on php_flag session.cookie_secure on
Инициализация сессии
Сессия начинается с помощью функции
session_start()
Эта функция должна быть включена во все скрипты, в которых вам нужно использовать сессии.
Сперва выполняет проверку наличия активной сессии. Если сессии нет - начинает новую.
Сохраняет данные в супер глобальной переменной
$_SESSION,
которая является
массивом
session_start();
$_SESSION['username'] = 'Andrei';
echo isset($_SESSION['username']) ? $_SESSION['username'] : 'Not available';
Если последняя строка вам непонятна - прочитайте статью
«Тернарный оператор в PHP»
Демонстрацию работы session_start() в вашем браузере вы можете сделать на
этой странице
Посмотреть куки можно в Chrome DevTools → Application → Cookies
Выберите eth1.ru или eth1.ru и найдите AOSESSID
Изучить файл с данными о сессии можно в директории, которую вы указали в
php_value session.save_path
В моём .htaccess указан
php_value session.save_path ./tmp
Поэтому я смотрю содержимое там
cat ./tmp/sess_d510566d6fc7dcbf9a9c21eb29d846ce
username|s:6:"Andrei";
Удаление сессии
Сессия истекает когда закрывается браузер, наступает таймаут, её явно делают просроченной.
Если не удалить данные, они так и будут лежать на сервере - это небезопасно.
Уничтожение сессии включает в себя:
- Удаление всех перемменых в сессии
- Удаление данных на сервере
- Удаление куки в клиенте
session_destroy()
Удаляет все данные привязанные к сессии.
Не удаляет никаких переменных из суперглобальной переменной
$_SESSION.
Не удаляет куки.
Возвращает boolean - удалились данные или нет
Если использовать только session_destroy() можно переиспользовать $_SESSION просто вызвав session_start()
unset()
unset() это стандартная PHP функция, которую использую не только с сессиями.
Чтобы очистить username нужно выполнить
unset($_SESSION['username']);
Чтобы очистить всё можно обойтись без unset()
$_SESSION = [];
Пример полного удалёния сессии
$_SESSION = [];
$params = session_get_cookie_params();
$options = array('lifetime' => time() - 60);
setcookie(session_name(), '', $options);
session_destroy();