PHP cессии

Содержание
Введение
Для чего используются сессии
Где настраивать сессии
session.configuration: Конфигурации
Функции
Пример .htaccess
session_start(): Начать сессию
Окончание сессии

Введение

HTTP протокол сам по себе stateless.

Сессии нужны для хранения информации о пользователях. Они используют cookie делают примерно то же что и cookies но лишены большинства их недостатков

Сессии это инструмент для управления состоянием приложения.

Как и $_COOKIE $_SESSION это суперглобальная переменная ( массив ) , которая хранится на веб сервере.

У каждой сессии есть уникальный номер Session ID или SID

Сессия должна быть начата до отправки данных браузеру.

Данные на сервере и куки в браузере работают в связке. SID хранится в куки.

Сервер «помнит» пользователя пока работа с сайтом ведётся в сессии.

Сессия удаляется автоматически при закрытии браузера. рассмотрим эти задачи в следующем параграфе

Что можно сделать с помощью сессий

Пример

Из обычной жизни: когда вы получаете счёт за электричество, там содержится много разной информации. Но чтобы оплатить его, нужен только номер счёта. Вводите номер счёта и всё остальное подтянется с сервера.

Пример запроса от клиента

Request 1 GET /homepage.php HTTP/1.1 Host: urn.su 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: urn.su 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.urn.su/?SID

Эту опцию обычно включают только тогда, когда нет поддержки cookies

По умолчанию выключена.

Пользуйтесь trans sid с осторожностью так как это может поставить под угрозу безопасность пользователя.

Подробности на http://php.net/session.use-trans-sid

session.cache_limiter: указывает способ контроля за кэшем во время сессии.

Доступные варианты:

По умолчанию 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

Выберите andreyolegovich.ru или urn.su и найдите 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();