Session php что это
Что такое сессии и как с ними работать в php
Протокол http, используемый для загрузки содержимого web-страниц, работает следующим образом: клиент присылает серверу http-запрос, сервер его обрабатывает и отправляет клиенту сформированный ответ. Всё, на этом общение закончено. Если нужны новые данные — клиент посылает новый запрос, а сервер присылает новый ответ и так далее.
При этом существует ряд задач, когда серверу для формирования ответа нужно понимать, присылал ли этот клиент какие-то http-запросы ранее и что происходило в процессе их обработки. Самый очевидный пример — авторизация. Скажем, клиент в очередном http-запросе запрашивает какую-то страницу личного кабинета. Что делать серверу? Если клиент авторизован (ранее присылал правильные данные для авторизации), то нужно ему эту страницу показать, а если не авторизован — то не нужно. А как узнать, авторизован пользователь или не авторизован? Значит нужно где-то хранить результаты выполнения предыдущих http-запросов.
Как раз для таких случаев и придумали сессии, — специальный механизм, позволяющий серверу идентифицировать присылающих http-запросы клиентов, а также запоминать для этих клиентов различные данные.
Применительно к php можно сказать, что сессии — это механизм, позволяющий php-скрипту, обрабатывающему очередной http-запрос, сделать следующие вещи:
Работают сессии следующим образом: сервер запоминает данные сессии (какие-то переменные) в специальном хранилище, которое подписывает сгенерированным уникальным идентификатором. Этот же идентификатор отправляется клиенту. При следующем http-запросе клиент присылает серверу полученный идентификатор, по которому сервер понимает от какого клиента пришёл запрос и с каким хранилищем ему работать (откуда восстанавливать данные и куда их сохранять).
Для работы с сессиями в php существуют специальные встроенные функции. Этих функций довольно много, основные я опишу ниже, а остальные можете посмотреть в документации, например вот здесь. Функции для работы с сессиями имеют большое количество всяких настроек, которые можно настраивать через конфиг php-сервера (файл php.ini), либо задавать в качестве опций непосредственно при вызове соответствующих функций. Многие настройки можно посмотреть через php_info().
По-умолчанию в качестве хранилища данных сессий php использует обычные файлы во временной папке. За это отвечает опция session.save_handler, которая по умолчанию установлена в значение files. При желании можно назначить свои собственные обработчики на связанные с сессиями события (старт, идентификация, сохранение данных и так далее) и хранить данные сессии как угодно и где угодно. Путь ко временной папке можно узнать при помощи функции sys_get_temp_dir().
Скрипт php может передать клиенту идентификатор созданного хранилища с помощью установки cookie или дописывая его к расположенным на загруженной странице адресам в качестве параметра GET-запроса. Выбор способа определяется настройками session.use_cookies, session_use_only_cookies и session_use_trans_sid. По умолчанию php настроен на использование только cookies (первые две настройки установлены в единицу, а последняя — в ноль). Используемое имя сессионной куки по-умолчанию — PHPSESSID.
Клиент может передать php-скрипту на сервере полученный ранее идентификатор любым способом (через cookie в заголовке запроса или указывая в качестве параметра GET-запроса) независимо от настроек. В случае с редиректом через header(‘Location: url’) куки не работают и идентификатор сессии должен быть передан на сервер в качестве параметра GET-запроса.
Время жизни сессии определяется параметром session.gc_maxlifetime. По прошествии этого времени файлы данных сессии будут рассматриваться как мусор и могут быть удалены. Кроме того, можно задать время жизни отправляемой клиенту cookie (для этого используется параметр session.cookie_lifetime). По-умолчанию для session.cookie_lifetime установлено значение 0, которое означает, что кука будет актуальна до закрытия браузера (просроченные куки называются «протухшими»).
Далее давайте рассмотрим основные функции для работы с сессиями из php скриптов. Лучше всего установить какой-нибудь WAMP/WNMP комплект и попробовать проделать своими руками всё, о чём ниже пойдёт речь. Я обычно использую OpenServer + Firefox (в этом браузере удобнее всего вызывать отладчик — одной кнопкой F12).
Функция session_start() имеет довольно много опций, которые позволяют настраивать различные параметры сессии (имя, время жизни, безопасность и так далее). Подробности можно прочитать в документации. Если никакие опции не указывать, то будут использоваться настройки по-умолчанию, — из конфига php. Главное правило при использовании функции session_start() состоит в том, что она должна вызываться до какого-либо вывода (то есть до начала формирования тела ответа).
Вторая нужная функция — ini_set(). С помощью этой функции можно менять настройки php по-умолчанию. При этом значения в файле php.ini не изменяются, новые настройки действуют только для текущего скрипта и только до окончания его обработки.
Ещё одна нужная функция — session_name(). С помощью этой функции можно получить имя текущей сессии (если вызвать функцию без параметров) или изменить имя сессии (если указать в качестве параметра новое имя).
Вообще, как я уже сказал, функций довольно много, у большинства из них есть куча разных настроек, так что доку тут читать не перечитать.
Сессии в PHP
Если выполнить эти два скрипта, то на первой странице мы увидим надпись «Меня задали на index.php», а вторая страница будет пустой.
Разработчики web-сайтов, недолго думая, стали использовать cookie для хранения глобальных переменных на стороне клиента. Процесс выглядел примерно так: пользователь приходит на главную страницу сайта, делает какие-то действия, и вся информация, связанная с этим пользователем, которая может потребоваться на других страницах сайта, будет храниться у него в браузере в виде cookie. Этот метод имеет довольно серьезные минусы, из-за которых от PHP в своё время отвернулось немало разработчиков. Например, нам нужно авторизовать пользователя, чтобы разрешить ему доступ к закрытым (или принадлежащим только ему) разделам сайта. Придется отправлять пользователю cookie, который будет служит его последующим идентификатором на сайте. Такой подход становится очень громоздким и не удобным, как только сайт начинает собирать всё больше и больше сведений о поведении пользователя, ведь всю информацию, посылаемую пользователю, желательно кодировать, чтобы её нельзя было подделать. Ещё совсем недавно подделкой cookie можно было «уложить» не один чат, а порой и пробраться в чужую почту. К тому же есть ещё на свете странные люди, у которых браузер cookie не поддерживает.
При использовании сессий вся информация хранится не на стороне клиента, а на стороне сервера, и потому лучше защищена от манипуляций злоумышленников. Да и работать с сессиями куда проще и удобнее, так как все данные автоматически проходят через алгоритмы криптографии модуля PHP. В броузере клиента, лишь хранится уникальный идентификатор номера сессии, либо в форме cookie, либо в виде переменной в адресной строке броузера, какой из двух способов использовать для передачи идентификатора сессии между страницами интерпретатор PHP выбирает сам. Это на 100% безопасно, так как идентификатор сессии уникален, и подделать его практически невозможно (об этом чуть далее, в разделе о безопасности сессий).
Я не буду вдаваться в технологические вопросы устройства механизма работы сессий, а только опишу, как правильно работать с сессиями в PHP.
Как работать с сессиями?
Если вы будете тестировать примеры из статьи (или ваши скрипты) на каком-либо коммерческом хостинге, проблем с работой с сессиями быть не должно. Если же вы сами настраивали ваш сервер (будь то реальный сервер, или эмулятор), могут появляться ошибки примерно такого содержания:
«Warning: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) failed: No such file or directory (2)».
Это значит всего лишь, что у вас неправильно настроен PHP. Решить эту проблему можно, прописав правильный путь (на существующую директорию) для сохранения сессий в файле php.ini и перезапустить сервер.
Любой скрипт, который будет использовать переменные (данные) из сессий, должен содержать следующую строчку:
Эта команда говорит серверу, что данная страница нуждается во всех переменных, которые связаны с данным пользователем (браузером). Сервер берёт эти переменные из файла и делает их доступными. Очень важно открыть сессию до того, как какие-либо данные будут посылаться пользователю; на практике это значит, что функцию session_start() желательно вызывать в самом начале страницы, например так:
Для задания директории в которой будут сохраняться файлы сессий используется функция session_save_path():
При последовательном запуске этих файлов, первый скрипт «index.php» выдаст следующий результат:
Всё ОК. Сессию загрузили! Пройдём, посмотрим что там:
А второй «dothings.php» вот это:
Меня задали на index.php
Примеры
Теперь обратимся к практическому применению механизма сессий. Здесь мы рассмотрим пару довольно простых и в то же время полезных примеров.
Авторизация Пользователя
Вопросы по авторизации пользователей с помощью PHP-сессий постоянно задаются в конференциях по web-программированию. Механизм авторизации пользователей в системе с помощью сессий довольно хорош с точки зрения безопасности (см.раздел Безопасность).
Наш пример будет состоять из трёх файлов: index.php, authorize.php и secretplace.php. Файл index.php содержит форму, где пользователь введёт свой логин и пароль. Эта форма передаст данные файлу authorize.php, который в случае успешной авторизации допустит пользователя к файлу secretplace.php, а в противном случае выдаст сообщение об ошибке.
Примеры: index.php authorize.php secretplace.php
Безопасность
Такие ситуации, основанные на том, что кто-то что-то у кого-то стащит, в общем, не входят в компетенцию программиста. Об этом должны заботиться администраторы и сами пользователи.
Как «залатать» дыру номер 1?
Не будем писать тонны кода по блокировке IP-адреса и т.п., а просто проверим, откуда приходит запрос, а точнее с какой страницы пришёл запрос, если это будет любая страница с нашего сайта, то всё нормально, а во всех остальных случаях пускать не будем. Подкорректируем файл authorize.php:
authorize.php V2
Как избавиться от «дыры» номер 2?
В принципе, любую переменную скрипта можно задать через адресную строку, просто дописав после полного адреса к скрипту вопросительный знак и название переменной с её значением. Давайте поправим наш код, чтобы этого избежать:
secretplace.php V2 Итоги
PHP cессии
Введение
HTTP протокол сам по себе stateless.
Сессии нужны для хранения информации о пользователях. Они используют cookie делают примерно то же что и cookies но лишены большинства их недостатков
Сессии это инструмент для управления состоянием приложения.
У каждой сессии есть уникальный номер 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 сервера.
Session Configurations Options
Полный список доступен на http://php.net
session.auto_start: автоматически начинает сессию.
По умолчанию выключена.
session.name: задаёт имя текущей сессии и сессионной куки
По умолчанию PHPSESSID.
session.save_path: путь по которому сохраняется информация о сессии
По умолчанию tmp директория сервера.
session.gc_maxlifetime: максимальное время жизни
По умолчанию 1440 секунд (24 минуты).
session.cookie_lifetime: время жизни куки, которая отправляется браузеру. По сути это значение, которое мы добавляем к time() когда задаём expires
Если включить то куки будут отправляться только по HTTPS.
По умолчанию выключена.
session.use_strict_mode: если включить то SID которые созданы не сервером будут отклонены.
По умолчанию выключена.
Если включить куки будет доступна только по HTTP (и HTTPS). То есть JavaScript или bbscript не смогут получить к куки доступ
По умолчанию выключена.
session.use_cookies: указывает нужно ли сохранять SID в cookies на стороне клиента.
По умолчанию включена.
session.use_only_cookies: заставляет сессию использовать только cookie для хранения SID. Работает совместно с session.use_cookies
По умолчанию включена.
session.use_trans_sid: контролирует использование «прозрачных» SID
Эту опцию обычно включают только тогда, когда нет поддержки cookies
По умолчанию выключена.
Пользуйтесь trans sid с осторожностью так как это может поставить под угрозу безопасность пользователя.
session.cache_limiter: указывает способ контроля за кэшем во время сессии.
По умолчанию nocache.
Для сессий с аутентификацией нужно, чтобы кэширование в браузере было отключено.
session.cookie_samesite: контролирует доступности куки в кроссдоменных запросах.
Доступные варианты: Lax и Strict
Кросдоменные запросы могу быть не только от злоумышленников. Их может делать ваш сайт с разных поддоменов. Либо вы можете следить за перемешением пользователя между своими проектами.
Функции
Полный список доступен на php.net
session_start(): начинает сессию и делает доступной переменную $_SESSION.
session_name(): переименовывает сессию.
Меняет значение, заданное с помощью функции session.name.
session_id(): получает или устанавливает текущий session id
set new session ID: session_id(‘ ‘)
session_destroy(): удаляет всю информацию записанную в сессию
Настройки вашего сервера могут отличаться, это просто пример
Инициализация сессии
Эта функция должна быть включена во все скрипты, в которых вам нужно использовать сессии.
Сохраняет данные в супер глобальной переменной $_SESSION, которая является массивом
Демонстрацию работы session_start() в вашем браузере вы можете сделать на этой странице
Посмотреть куки можно в Chrome DevTools → Application → Cookies
Выберите andreyolegovich.ru или urn.su и найдите AOSESSID
Изучить файл с данными о сессии можно в директории, которую вы указали в php_value session.save_path
Поэтому я смотрю содержимое там
Удаление сессии
Сессия истекает когда закрывается браузер, наступает таймаут, её явно делают просроченной.
Уничтожение сессии включает в себя:
session_destroy()
Удаляет все данные привязанные к сессии.
Не удаляет никаких переменных из суперглобальной переменной $_SESSION.
Если использовать только session_destroy() можно переиспользовать $_SESSION просто вызвав session_start()
unset()
unset() это стандартная PHP функция, которую использую не только с сессиями.
Чтобы очистить username нужно выполнить
unset ($_SESSION[ ‘username’ ]);
Чтобы очистить всё можно обойтись без unset()
Пример полного удалёния сессии
Сессии в PHP
Сессии в PHP представляют из себя механизм сохранения на стороне сервера информации о компьютере клиента. На самом деле сессии в PHP — это не такая сложная тема, но для её понимания нужно знать принцип работы cookie в PHP. Так что, если вы не знаете как работают cookie в PHP, то сначала читайте соответствующую статью, а потом уже возвращайтесь сюда.
Слово session с английского переводится как сеанс, так сам смысл сессий в PHP становится более понятным, но у программистов прижился термин «сессии», его и мы будем использовать в этой статье.
Сессии в PHP очень похожи на механизм cookie, те же самые пары ключ => значение, только они хранятся на стороне сервера.
Функция session_start()
Функция session_start() желательно вызывать в самом начале страницы, но в моих примерах я этого не делаю.
Сессии — это группы переменных, которые хранятся на сервере, но относятся к одному уникальному посетителю. Повторю, это ключевой момент: сессии хранятся на сервере.
Для того, чтобы обеспечить взаимодействие каждого посетителя с его данными из его сессии используется файл cookie, команду создать который PHP даёт сам, вам об это беспокоится не нужно. Этот cookie имеет значение только для сервера и не может быть использован для получения данных о пользователе.
Давайте наконец начнём использовать примеры. Всё очень просто.
Функция session_id()
Можете посмотреть в панели инструментов для разработчиков вашего браузера (в Chrome для этого нажмите Ctrl + Shift + I, потом Resources, и там найдёте cookie), этот домен положил вашему браузеру cookie с именем PHPSESSID и примерно таким значением: «7g5df9rkd1hhvr33lq1k6c72p7».
Функция session_name()
Если функции session_id() позволяет получать значение идентификатора сессии, функция session_name() позволяет узнать имя сессии.
Ещё раз про функцию session_start()
Пример использования сессии
Сейчас мы рассмотрим пример, который позволит провести небольшие эксперименты с сессиями.
Если закрыть окно браузера, то сессия прекратится, наш счётчик обнулится. Такое поведение сессий в PHP можно изменить, к этому вопросу мы вернёмся чуть дальше в статье.
Завершение сессии
Так как сессии часто используются для авторизации пользователей, то нужно иметь механизм «выхода» из системы.
Для того, чтобы завершить сессию нам нужно:
Функция session_destroy() удаляет временное хранилище на сервере. Кстати, она больше ничего не делает.
Пример завершения сессии:
Теперь можете провести эксперимент: запустить в одном окне пример со счётчиком, накрутить счётчик, а потом запусть пример с удалением сессии и снова обновить страницу со счётчиком.
Удаление файла cookies можно сделать так:
Ещё раз про функции session_name() и session_id()
Функции session_name() и session_id() на практике используются редко, но я о них пишу, так как в статье нужно раскрыть сам механизм работы сессий в PHP.
При использовании данного примера всем пользователям будет назначен один и тот же идентификатор сессии.
Тут подробней остановимся, если вы запустите пример из секции про функцию session_name() (вот ссылка) в разных браузерах (например в Chrome и в Internet Explorer), то в каждом браузере будет свой, уникальный идентификатор сессии. Браузеры хранят файлы cookies каждый в своей папке, поэтому функция session_start() даст каждому браузеру создать свой, уникальный идентификатор и, соответственно, для каждого браузера будет создано уникальное хранилище на сервере. Поэтому пример со счётчиком (этот) в каждом браузере будет работать независимо друг от друга.
Если задать одинаковый идентификатор сессии для всех пользователей, то они будут работать с одним хранилищем на сервере. Вот пример счётчика, который будет считать посещения с разных браузеров:
Если вы запустите этот пример, то не факт что вы увидите там единицу. Другие посетители могли уже изменить значения в хранилище сессий на сервере. Когда в этом случае сервер удаляет хранилище — я не знаю, поэтому при превышении счётчиком значения 100 буду завершать сессию.
Установка времени ожидания
По умолчанию, сессия «живёт» до тех пор, пока посетитель не закроет окно браузера. Это обусловлено тем, что функция session_start() ложит клиенту такой cookie.
session_set_cookie_params (int lifetime [, string path [, string domain [, bool secure]]])
На практике достаточно использовать только первый параметр (lifetime), сюда записываете время в секундах, определяющее сколько сервер должен помнить состояние сессии после закрытия браузера.
Действие функции session_set_cookie_params() распространяется только на период работы скрипта.
Вот пример использования этой функции:
Накрутите счётчик и закройте браузер, через 30 сукунд опять откройте этот пример. Ваша сессия сохранится.
Сессии в PHP
Сессия — это механизм для сохранения информации на разных веб-страницах для идентификации пользователей при навигации по сайту или приложению. В отличие от файлов cookie, информация не сохраняется на компьютере пользователя.
Что такое сессия в PHP?
Известно, что веб-сервер не поддерживает постоянного соединения с посетителем, и каждый запрос обрабатывается, как новый, без связи с предыдущими. А это означает, что сервер не может запоминать конкретного посетителя между несколькими запросами, т.е. при доступе к веб-странице сервер отвечает за предоставление содержимого только конкретной запрашиваемой страницы. Часто возникает необходимость отображать информацию определенного пользователя на всех страницах и, при этом, вам нужно аутентифицировать пользователя в каждом запросе. Представьте, что вам нужно было бы вводить логин и пароль пользователя на каждой странице, где была представлена ваша информация о профиле. Это было бы вообще не практично, и именно в таких случаях необходимы сессии.
Переменные сессии решают эту проблему, сохраняя информацию о пользователе, которая будет использоваться на нескольких веб-страницах (например, логин посетителя, любимая музыка и др.). По умолчанию переменные сессии действуют до тех пор, пока пользователь не закроет браузер.
Одним из недостатков файлов cookie является то, что они хранятся на компьютере пользователя. Это дает пользователю возможность получать доступ, просматривать и изменять этот файл cookie, что может привести к сбою приложения. Сессии PHP, наоборот, хранят в системе пользователя только идентификационный файл cookie, который используется для ссылки на файл сессии на сервере. Таким образом, пользователь не имеет доступа к содержимому файла сессии, тем самым обеспечивая безопасную альтернативу файлам cookie. Сессии PHP также работают, когда пользователь отключает поддержку файлов cookie браузером.
Сеанс создает файл во временном каталоге на сервере, где хранятся зарегистрированные переменные сеанса и их значения. Эти данные будут доступны для всех страниц сайта во время этого посещения.
Сессия создает файл во временном каталоге на сервере, где хранятся зарегистрированные переменные сессии и их значения. Эти данные будут доступны для всех страниц сайта во время этого посещения пользователем.
Пример использования в файле php.ini:
Изменить директорию для хранения файлов сессий можно добавив в файл .htaccess:
Перед использованием любой переменной сеанса убедитесь, что вы установили этот путь.
Когда сессия стартует, происходит следующее:
Сначала PHP создает уникальный идентификатор для этой конкретной сессии, который представляет собой случайную строку из 32 шестнадцатеричных чисел, например 5c9foj24c3jj973hjkop2fc937e3463.
Файл cookie под названием PHPSESSID автоматически отправляется на компьютер пользователя для хранения уникальной строки идентификации сессии.
Файл автоматически создается на сервере в назначенном временном каталоге и имеет имя уникального идентификатора с префиксом sess_, т.е. sess_5c9foj24c3jj973hjkop2fc937e3463.
С помощью специальных функций мы можем получить данный идентификатор:
То же значение мы могли бы получить, обратившись к cookie напрямую:
Сессия заканчивается, когда пользователь закрывает браузер или покидает сайт, сервер завершает сеанс через заранее определенный период времени, обычно продолжительностью 30 минут.
Запуск сессии PHP
Поместите этот код в файл test.php и загрузите его несколько раз, чтобы увидеть результат:
Пример
Примечание: Функция session_start() должна быть объявлена в самом начале вашего документа — ПЕРЕД всеми html-тегами.
Доступ к данным сессии PHP
Пример
Ещё один способ показать все значения переменных сессии для пользовательского сеанса — запустить следующий код:
Пример
Как изменить переменную сессии?
Чтобы изменить переменную сессии, достаточно просто её перезаписать. Поменяем значение переменной counter из предыдущих примеров с числа на строку:
Пример
Уничтожение сессии
Чтобы удалить все глобальные переменные сессии и уничтожить сессию, используйте функции session_unset() и session_destroy() :
Пример
Автоматическое включение сессии
Сессии без куки
Рассмотрим еще один метод отправки идентификатора сеанса в браузер пользователя, когда он не разрешает хранить файлы cookie на своем компьютере.
В следующем примере показано, как зарегистрировать переменную и правильно установить ссылку на другую страницу с помощью SID:
Пример
Функция htmlspecialchars() может использоваться для вывода SID с целью предотвращения XSS-атак.