- Session identifier in php
- session_create_id
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes 2 notes
- Как использовать сессии и переменные сессий в PHP
- Что такое сессия в PHP?
- Обработка входа с сессиями и файлами «куки» (cookie)
- Как запустить сессию
- Использование функции session_start
Session identifier in php
Модуль сессии поддерживает оба метода. Метод с cookies является оптимальным, но он не всегда доступен. Поэтому PHP предоставляет второй способ, который внедряет идентификатор сессии непосредственно в URL.
PHP умеет преобразовывать ссылки прозрачно. Если session.use_trans_sid включена, все относительные URI-адреса будут автоматически содержать идентификатор сессии.
Замечание:
Директива arg_separator.output из php.ini позволяет настраивать разделитель аргументов. Для полной совместимости с XHTML следует указывать &.
В качестве альтернативы вы можете использовать константу SID , которая устанавливается при запуске сессии. Если клиентское ПО не хранит подходящую сессионную cookie, SID имеет вид session_name=session_id . В противном случае содержит пустую строку. Таким образом, вы можете в любом случае внедрять его в URL.
Приведённый ниже пример демонстрирует, как зарегистрировать переменную и как правильно построить ссылку на другую страницу, используя SID .
Пример #1 Подсчёт количества посещений конкретного пользователя
if (empty( $_SESSION [ ‘count’ ])) $_SESSION [ ‘count’ ] = 1 ;
> else $_SESSION [ ‘count’ ]++;
>
?>
Здравствуйте, посетитель, вы видели эту страницу раз.
Функция htmlspecialchars() может использоваться для вывода SID с целью предотвращения XSS-атак.
Вывод SID способом, показанном выше, не является обязательным, если опция —enable-trans-sid была использована при компиляции PHP.
Замечание:
Подразумевается, что неотносительные URL-адреса указывают только на внешние сайты и потому SID к ним не добавляется, т.к. это представляло бы угрозу для безопасности, в частности, риск утечки SID другому серверу.
session_create_id
session_create_id() используется для создания нового идентификатора текущей сессии. Возвращает идентификатор сессии, который не подвержен коллизиям.
При неактивной сессии проверка на коллизии не осуществляется.
Идентификатор сессии создаётся в соответствии с настройками php.ini.
Важно использовать тот же идентификатор пользователя на вашем веб-сервере, что и для скрипта задачи сборщика мусора. В противном случае, у вас могут возникнуть проблемы доступа, особенно с дескриптором сохранения файлов.
Список параметров
Если указан параметр prefix , то новый идентификатор сессии будет с префиксом prefix . Не все символы возможно использовать в идентификаторе сессии. Допускается использовать только символы из диапазона: a-z A-Z 0-9 , (запятая) и — (минус) .
Возвращаемые значения
session_create_id() возвращает новый, не подверженный коллизиям, идентификатор текущей сессии. Если используется при неактивной сессии, проверка на коллизии пропускается. В случае неудачи возвращается false .
Примеры
Пример #1 Пример использования session_create_id() с функцией session_regenerate_id()
// Функция My session start с управлением на основе временных меток
function my_session_start () session_start ();
// Не разрешать использование слишком старых идентификаторов сессии
if (!empty( $_SESSION [ ‘deleted_time’ ]) && $_SESSION [ ‘deleted_time’ ] < time () - 180 ) session_destroy ();
session_start ();
>
>
?php
// Функция My session regenerate id
function my_session_regenerate_id () // Вызов session_create_id() пока сессия активна, чтобы
// удостовериться в отсутствии коллизий.
if ( session_status () != PHP_SESSION_ACTIVE ) session_start ();
>
// ВНИМАНИЕ: Никогда не используйте конфиденциальные строки в качестве префикса!
$newid = session_create_id ( ‘myprefix-‘ );
// Установка временной метки удаления. Данные активной сессии не должны удаляться сразу же.
$_SESSION [ ‘deleted_time’ ] = time ();
// Завершение сессии
session_commit ();
// Убеждаемся в возможности установки пользовательского идентификатора сессии
// ЗАМЕЧАНИЕ: Вы должны включать опцию use_strict_mode для обычных операций.
ini_set ( ‘session.use_strict_mode’ , 0 );
// Установка нового пользовательского идентификатора сессии
session_id ( $newid );
// Старт сессии с пользовательским идентификатором
session_start ();
>
// Убеждаемся, что опция use_strict_mode включена.
// Опция use_strict_mode обязательна по соображениям безопасности.
ini_set ( ‘session.use_strict_mode’ , 1 );
my_session_start ();
// Идентификатор сессии должен генерироваться заново при:
// — Входе пользователя в систему
// — Выходе пользователя из системы
// — По прошествии определённого периода времени
my_session_regenerate_id ();
// Далее основной код программы
?>
Смотрите также
- session_regenerate_id() — Генерирует и обновляет идентификатор текущей сессии
- session_start() — Стартует новую сессию, либо возобновляет существующую
- session.use_strict_mode
- SessionHandler::create_sid() — Возвращает новый идентификатор сессии
User Contributed Notes 2 notes
This function is very hard to replicate precisely in userland code, because if a session is already started, it will attempt to detect collisions using the new «validate_sid» session handler callback, which did not exist in earlier PHP versions.
If the handler you are using implements the «create_sid» callback, collisions may be detected there. This is called when you use session_regenerate_id(), so you could use that to create a new session, note its ID, then switch back to the old session ID. If no session is started, or the current handler doesn’t implement «create_sid» and «validate_sid», neither this function nor session_regenerate_id() will guarantee collision resistance anyway.
If you have a suitable definition of random_bytes (a library is available to provide this for versions right back to PHP 5.3), you can use the following to generate a session ID in the same format PHP 7.1 would use. $bits_per_character should be 4, 5, or 6, corresponding to the values of the session.hash_bits_per_character / session.sid_bits_per_character ini setting. You will then need to detect collisions manually, e.g. by opening the session and confirming that $_SESSION is empty.
function session_create_random_id ( $desired_output_length , $bits_per_character )
$bytes_needed = ceil ( $desired_output_length * $bits_per_character / 8 );
$random_input_bytes = random_bytes ( $bytes_needed );
// The below is translated from function bin_to_readable in the PHP source (ext/session/session.c)
static $hexconvtab = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,-‘ ;
$p = 0 ;
$q = strlen ( $random_input_bytes );
$w = 0 ;
$have = 0 ;
$chars_remaining = $desired_output_length ;
while ( $chars_remaining —) if ( $have < $bits_per_character ) if ( $p < $q ) $byte = ord ( $random_input_bytes [ $p ++] );
$w |= ( $byte $have += 8 ;
> else // Should never happen. Input must be large enough.
break;
>
>
// consume $bits_per_character bits
$out .= $hexconvtab [ $w & $mask ];
$w >>= $bits_per_character ;
$have -= $bits_per_character ;
>
Как использовать сессии и переменные сессий в PHP
Sajal Soni Last updated Feb 16, 2021
Обработка сессии это ключевой приём в PHP, что позволяет хранить данные пользователя на всех страницах веб-сайта или приложения. Из этой статьи вы узнаете основы обработки сессии в PHP.
Мы начнем с объяснения того, как работают сессии и как они связаны с куки-файлами. Затем мы рассмотрим несколько фрагментов кода, демонстрирующих, как работать с сеансами. Вы узнаете, как создавать и уничтожать сеансы и как изменять переменные сеанса.
Что такое сессия в PHP?
Сессия — это механизм для сохранения информации на разных веб-страницах для идентификации пользователей пока они бродят по сайту или приложению. Вам интересно, почему сеансы нужны для веб-сайта? Чтобы понять, почему сеансы необходимы, нам нужно чуть вернуться назад и посмотреть, как работает HTTP-протокол.
Протокол HTTP — это протокол без учета состояния, что означает, что сервер не может сопоставить конкретного пользователя по несколькими запросами. Например, при доступе к веб-странице, сервер несёт ответственность за предоставление содержимого запрашиваемой страницы. Поэтому, когда вы обращаетесь к другим страницам одного и того же веб-сайта, веб-сервер интерпретирует каждый запрос отдельно, как если бы они не были связаны друг с другом. Серверу не известно, что каждый запрос исходит от одного и того же пользователя.
Следующая диаграмма вкратце изображает протокол HTTP.
В этой модели, если вы хотите отобразить пользовательскую информацию, вам нужно будет аутентифицировать пользователя в каждом запросе. Представьте, что вам нужно было вводить ваше имя пользователя и пароль на каждой странице с информацией ваших о данных! Да, это было бы громоздко и вообще не практично, и именно здесь на помощь приходят сеансы.
Сессия позволяет вам обмениваться информацией с разными страницами одного сайта или приложения, и помогает поддерживать состояние. Это позволяет серверу знать, что все запросы исходят от одного и того же пользователя, что позволяет сайту отображать информацию и настройки пользователя.
Обработка входа с сессиями и файлами «куки» (cookie)
Давайте быстро рассмотрим общий пример входа на веб-сайт, чтобы понять, что происходит за кулисами.
- Пользователь открывает страницу входа на веб-сайт.
- После отправки формы входа, сервер, на другом конце, аутентифицирует запрос, проверив введённые учётные данные.
- Если учётные данные, введённые пользователем, верны, сервер создаёт новый сеанс. Сервер генерирует уникальное случайное число, которое называется идентификатором сеанса. Также, на сервере, создаётся новый файл, который используется для хранения информации, относящейся к сеансу.
- Затем, идентификатор сеанса передаётся обратно пользователю, вместе с тем, что он запросил. За кулисами этот идентификатор сеанса отправляется в заголовке ответа «куки» PHPSESSID (так называется по умолчанию).
- Когда браузер получает ответ от сервера, он получает заголовок куки-файла PHPSESSID . Если в браузере разрешены «куки», то он сохранит этот PHPSESSID , в котором хранится идентификатор сеанса, переданный сервером.
- Для последующих запросов, «кука» PHPSESSID передаётся обратно на сервер. Когда сервер получает «куку» PHPSESSID , он пытается инициализировать сеанс с этим идентификатором сеанса. Он делает это, загружая файл сеанса, который был создан ранее во время инициализации сеанса. Затем он инициализирует суперглобальную переменную массива $_SESSION с данными, хранящимися в файле сеанса.
Таким образом, пользовательские данные сохраняются даже в нескольких запросах, и пользователь не теряется на протяжении всего сеанса.
На следующей диаграмме показано, как протокол HTTP работает с сеансами.
Теперь, когда вы увидели краткое введение в работу сессий, мы создадим несколько практических примеров, чтобы продемонстрировать, как создавать и манипулировать переменными сессии.
Как запустить сессию
В этом разделе мы обсудим, как запустить сессию в PHP.
Всякий раз, когда вы хотите поработать с переменными сеанса, необходимо убедиться, что сеанс уже запущен. Сеанс в PHP можно запустить несколькими способами.
Использование функции session_start
Метод, в котором сессия запускается функцией session_start , вы будете видеть часто.