session_id
session_id() используется для получения или установки идентификатора текущей сессии.
Константа SID также может быть использована для получения текущего имени и идентификатора сессии в виде строки, подходящей для добавления в URL-адреса. Смотрите также Работа с сессиями.
Список параметров
Если указан параметр id и он не равен null , то он заменит идентификатор текущий сессии. Для этого session_id() следует вызывать до session_start() . В зависимости от обработчика сессии, не все символы возможно использовать в идентификаторе сессии. Например, файловый обработчик сессии поддерживает только символы из диапазона a-z A-Z 0-9 , (запятая) и — (минус) !
Замечание: При использовании сессионных cookie, указание id для session_id() приводит к тому, что при вызове session_start() всегда будут отправлены новые cookie, независимо от того, совпадает ли идентификатор текущей сессии с вновь установленным.
Возвращаемые значения
session_id() возвращает идентификатор текущей сессии или пустую строку ( "" ), если нет текущей сессии (идентификатор текущей сессии не существует). В случае неудачи возвращает false .
Список изменений
Версия | Описание |
---|---|
8.0.0 | id теперь может быть null . |
Смотрите также
- session_regenerate_id() — Генерирует и обновляет идентификатор текущей сессии
- session_start() — Стартует новую сессию, либо возобновляет существующую
- session_set_save_handler() — Устанавливает пользовательские обработчики хранения сессии
- session.save_handler
User Contributed Notes 21 notes
It may be good to note that PHP does not allow arbitrary session ids. The session id validation in PHP source is defined in ext/session/session.c in the function php_session_valid_key:
To put it short, a valid session id may consists of digits, letters A to Z (both upper and lower case), comma and dash. Described as a character class, it would be [-,a-zA-Z0-9]. A valid session id may have the length between 1 and 128 characters. To validate session ids, the easiest way to do it use a function like:
function session_valid_id ( $session_id )
<
return preg_match ( ‘/^[-,a-zA-Z0-9]<1,128>$/’ , $session_id ) > 0 ;
>
?>
session_id() itself will happily accept invalid session ids, but if you try to start a session using an invalid id, you will get the following error:
Warning: session_start(): The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and ‘-,’
session_id() URL-decodes the session value. For example let’s say we use setcookie() to push a cookie down to a web browser. When the browser makes the next page request the browser sends the cookie back up to us with headers like this: Cookie: PHPSESSID=enGHumY%2C-2De-F-TDzNHVmE%2ChY5;
If we use session_id() to read the cookie it will output a value of this: enGHumY,-2De-F-TDzNHVmE,hY5
The two values don’t match! Use either setrawcookie() or URL encode if you wish to match the original value.
I was perplexed by inconsistent results with the session ID depending on whether I retrieve it using SID, COOKIE, or session_id(). I have found that session_id() is the most reliable method, whereas SID and COOKIE[«PHPSESSIONID»] are sometimes undefined.
I used this simple script to quickly test the problem on my servers:
<?php
$a = session_id ();
if(empty( $a )) session_start ();
echo «SID: » . SID . «<br>session_id(): » . session_id (). «<br>COOKIE: » . $_COOKIE [ «PHPSESSID» ];
?>
Regardless of browser I see the COOKIE undefined on the first load and the other two defined, then SID is empty on subsequent reloads and COOKIE is defined, but session_id() is always defined.
If I insert the session_regenerate_id() method that jeff_zamrzla gives below the refresh the page, I get a new session_id() but the COOKIE value is initially the prior session_id() until I hit refresh a second time. So again, session_id() proves to be the most reliable method.
It’s probably not a bug since I found the behaviour to be consistent in PHP versions 5.2.14, 5.3.3 and 5.3.4, but I can’t figure what I’m missing and hopefully this will help others who run into this.
This can looks obvious, but as me, you can spend some hours to make a simple session work between different browsers and devices. These are the basics for me, but you can build upon.
<?php
if( $_GET ) <
//defining the session_id() before session_start() is the secret
session_id ( $_GET [ ‘session_id’ ]);
session_start ();
echo «Data: » . $_SESSION [ ‘theVar’ ];
//use your data before below commands
session_destroy ();
session_commit ();
>else <
//common session statement goes here
session_start ();
$session_id = session_id ();
$_SESSION [ ‘theVar’ ] = «theData» ;
echo «your.php?session_id keyword»>. $session_id ;
>
?>
I had a lot of trouble with session_regenerate_id() as it did not regenerate. Session_id() stayed the same no matter what (unless closing the window). I wanted to have different sid and empty vars for each session/page meeting a condition for security reasons. Finally, this worked:
<?php
$a = session_id ();
if ( $a == » ) session_start ();
if ( . add check if you want to regenerate and destroy vars on some condition only [ recommended :)]. )
< session_unset (); //destroys variables
session_destroy () //destroys session;
>
$a = session_id ();
if ( $a == » ) session_start ();
if (!isset( $_SESSION [ ‘safety’ ]))
<
session_regenerate_id ( true );
$_SESSION [ ‘safety’ ] = true ;
>
$_SESSION [ ‘sessionid’ ] = session_id ();
?>
Now you get different sid and session variables empty for each session_start if condition is met (i.e. user hits refresh on user/password form, which I needed badly :). Hope this helps someone out there.
Env: localhost
Note: condition is mandatory, otherwise it destroys on each load.
The higher you set session.hash_bits_per_character the shorter your session_id will become by using more bits per character. The possible values are 4, 5, or 6.
When using sha-1 for hashing (by setting ini_set(‘session.hash_function’, 1) the following session string lengths are produced by the three session.hash_bits_per_character settings:
4 — 40 character string
5 — 32 character string
6 — 27 character string
It would seem desirable to use sha-l with 5 bits_per_character because this will emulate a standard 32 character md5 string and make a would-be attacker think that is what you’re hashing with.
Note that Firefox and Mozilla use the same process for launching new windows or tabs, they will pick up the same session id as the previous windows until the parent process dies or is closed. This may cause undesired results if the session id is stored in a db and checked, a solution is to check at the new entry point (new tab or window if the user went back to the index page) for an existing session. If a session id exists and a new one is required use something like:
<?php
$ses_id = session_id ();
$bsid_exists = false ;
$bsid_exists = check_session_id_from_db ( $ses_id );
if ( $bsid_exists ) <
//This is a reentry and the session already exists
// create a new session ID and start a new
session_regenerate_id ();
$ses_id = session_id ();
>
?>
In response to simon at quo dot com dot au:
The PHPSESSID is produced using an hash function. By default, it uses MD5 which produces 128 bits long (i.e: 16 bytes long) hashes.
But, since some bytes’ values may not be used in the HTTP header, PHP outputs the hash in its hexadecimal representation, thus resulting in a 32 bytes long text.
Starting with PHP 5.0, you can change the hash function used (by setting «session.hash_function» to whatever function you want to use in php.ini).
You may for example set it to 1 to switch to SHA-1 which produces 160 bits (20 bytes) long hashes.
Please also note that another setting was introduced in PHP 5 (session.hash_bits_per_character) which sort of «compresses» the hash. Thus, resulting in what seems to be a shorter hash.
This feature helps you improve your application’s security by producing IDs that are harder to prodict for a malicious attacker.
Gosh, took a LOOONG time to figure this one out! If you have suhosin built into your PHP and can’t get sessions to work after changing the session id through session_id(), try turning off suhosin’s session encryption option in php.ini with:
About the note from Cybertinus :
The following test doesn’t work, the code following is always executed :
<?php
if(! session_id ())
<
// Always executed even if there’s already an opened session
>
session_id () returns an empty string if there is no current session , so to test if a session already exists , it ‘s better to write this :
if(session_id() == «»)
<
session_start();
>
else
<
// Anything you want
>
?>
The documentation for session_id is incomplete when it says:
«For example, the file session handler only allows characters in the range a-z, A-Z and 0-9!».
It is untrue when changing the default for the session.hash_bits_per_character as Colin said. session_id may therefore contain «-» and «,».
Get a shared session.
Sometimes is good can interchange messages and vars between one session and another, but PHP dont support this. I create this script that allows with session_id() change from current session to shared session (this is, info with scope to all sessions) for read and write info and back in to user session. The code:
<?php
ini_set ( ‘display_errors’ , 1 );
error_reporting ( E_ALL );
function get_global ( $key ) <
//Get current session
if( session_status ()!= PHP_SESSION_ACTIVE ) session_start ();
$current_id = session_id ();
session_write_close ();
//Set a global session with session_id=1
session_id ( 1 );
session_start ();
//Get superglobal value
$value = null ;
if(isset( $_SESSION [ $key ])) $value = $_SESSION [ $key ];
session_write_close ();
//Set the before session
session_id ( $current_id );
session_start ();
return $value ;
>
function set_global ( $key , $value ) <
//Get current session
if( session_status ()!= PHP_SESSION_ACTIVE ) session_start ();
$current_id = session_id ();
session_write_close ();
//Set a global session with session_id=1
session_id ( 1 );
session_start ();
//Set superglobal value
$_SESSION [ $key ]= $value ;
session_write_close ();
//Set the before session
session_id ( $current_id );
session_start ();
>
//Example
//Begin my session normally
session_start ();
if(empty( $_SESSION [ ‘count’ ])) <
$_SESSION [ ‘count’ ]= 0 ;
$_SESSION [ ‘color’ ]= «rgb(» . rand ( 0 , 255 ). «,» . rand ( 0 , 255 ). «,» . rand ( 0 , 255 ). «)» ;
>
$_SESSION [ ‘count’ ]++;
$id = session_id ();
//Get the superglobal
$test = get_global ( «test» );
//Set the superglobal test with empty array if this dont set
if( $test == null ) $test =array();
//Get the superglobal
$test = get_global ( «test» );
//Set values for each reload page and save the session_id that create it
$test []= «<span style=’color:» . $_SESSION [ ‘color’ ]. «‘>Value: » . rand ( 0 , 100 ). » SessionID: $id </span><br>» ;
//Save the superglobal
set_global ( «test» , $test );
//Show the superglobal
foreach( $test as $t ) <
echo $t ;
>
echo «<b>Reloads keyword»>. $_SESSION [ ‘count’ ]. «, <span style=’color:» . $_SESSION [ ‘color’ ]. «‘>This my color</span></b>» ;
Как использовать сессии и переменные сессий в PHP
От автора: обработка сессии PHP является ключевой концепцией языка, которая позволяет сохранять информацию пользователя на всех страницах веб-сайта или приложения. В этом посте вы узнаете основы обработки сессий в PHP.
Мы начнем с пояснения того, как работают сессии и как они связаны с файлами куки. Затем мы рассмотрим несколько фрагментов кода, демонстрирующих, как работать с сессиями. Вы узнаете, как создавать и удалять сессии и как изменять переменные сессии.
Что такое сессия в PHP?
Сессия — это механизм для сохранения информации на разных веб-страницах для идентификации пользователей при навигации по сайту или приложению. Вам интересно, почему сессии необходимы для веб-сайта? Чтобы понять, для чего необходимы сессии, нам нужно рассмотреть, как работает протокол HTTP.
Протокол HTTP — это протокол без учета состояния, что означает, что сервер не может запоминать конкретного пользователя между несколькими запросами. Например, при доступе к веб-странице сервер отвечает за предоставление содержимого запрашиваемой страницы. Поэтому, когда вы обращаетесь к другим страницам одного и того же веб-сайта, веб-сервер интерпретирует каждый запрос отдельно, как если бы они не были связаны друг с другом. Серверу не известно, что каждый запрос исходит от одного и того же пользователя. Следующая диаграмма иллюстрирует протокол HTTP.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля
В этой модели, если вы хотите отображать информацию пользователя, вам нужно будет аутентифицировать пользователя в каждом запросе. Представьте, что вам нужно было бы вводить имя пользователя и пароль на каждой странице, на которой была представлена ваша информация о профиле! Да, это было бы вообще не практичным, и именно здесь на сцену выходят сессии.
Сессия позволяет обмениваться информацией на разных страницах одного сайта или приложения, что помогает поддерживать состояние. Это позволяет серверу знать, что все запросы исходят от одного и того же пользователя, что дает возможность отображать информацию и настройки пользователя.
Поток авторизации с помощью сессий и файлов куки
Давайте кратко рассмотрим общий поток авторизации, чтобы понять, что происходит за кулисами.
Пользователь открывает страницу авторизации на сайте.
После отправки данных формы входа сервер на другом конце аутентифицирует запрос, проверив введенные учетные данные.
Если учетные данные, введенные пользователем, действительны, сервер создает новую сессию. Сервер генерирует уникальное случайное число, которое называется идентификатором сессии. Он также создает новый файл, который используется для хранения информации, относящейся к сессии.
Затем пользователю передается идентификатор сессии, а также любой запрошенный ресурс. За кулисами этот идентификатор сеанса отправляется в файле куки PHPSESSID в заголовке ответа.
Когда браузер получает ответ от сервера, он находит его в заголовке файла куки PHPSESSID. Если куки разрешены браузером, он сохранит этот файл PHPSESSID, в котором хранится идентификатор сессии, переданный сервером.
Для последующих запросов куки PHPSESSID возвращается на сервер. Когда сервер получает файл куки PHPSESSID, он попытается инициализировать сессию с этим идентификатором сессии. Он делает это, загружая файл сессии, который был создан ранее во время инициализации сессии. Затем он инициализирует переменную суперглобального массива $_SESSION с данными, хранящимися в файле сессии.
Таким образом, пользовательские данные сохраняются для нескольких запросов, и пользователь остается авторизованным на протяжении всей сессии. На следующей диаграмме показано, как протокол HTTP работает с сессиями.
Теперь, когда мы кратко рассмотрели сессии, мы возьмем несколько практических примеров, чтобы продемонстрировать, как создавать и изменять переменные сессии.
Как начать сессию
В этом разделе мы рассмотрим, как в PHP начать сессию. Каждый раз, когда вы хотите работать с переменными сессии, вам необходимо убедиться, что сессия уже запущена. Есть несколько способов начать сессию в PHP.
Использовать функцию session_start
Это метод, который вы встретите чаще всего, когда сессия запускается функцией session_start.
Phpsessid что это
Сессии представляют набор переменных, которые хранятся на сервере (либо часть на сервере, а часть — в cookie браузера) и которые относятся только к текущему пользователю. В какой-то степени сессии являются альтернативой кукам в плане сохранения данных о пользователе.
Для запуска сессии необходимо вызвать функцию session_start() . Она должна вызываться до отправки ответа пользователю:
При запуске сессии с помощью функции session_start() , если пользователь первый раз заходит на сайт, PHP назначает ему уникальный идентификатор сессии. Этот идентификатор с помощью cookie, которые по умолчанию называются «PHPSESSID», сохраняется в браузере пользователя. С помощью этого идентификатора пользователь ассоциируется с данными сессии. Если для пользователя уже установлена сессия, то данная функция продлевает текущую сессию вместо установки новой.
С помощью специальных функций мы можем получить идентификатор сессии:
То же значение мы могли бы получить, обратившись к cookie напрямую:
Затем для сохранения или получения данных в сессии надо использовать глобальный ассоциативный массив $_SESSION . Сохранение переменной в сессии:
Получение сохраненного значения:
Сохранение данных в сессии
Запустим сессию и сохраним в ней значения:
После установки сессии в браузере мы сможем заметить установку специальной куки, которая по умолчанию называется «PHPSESSID»:
Получение данных сессии
Теперь получим эти значения и выведем на страницу:
Удаление данных сессии
Сессия уничтожается с закрытием браузера, однако мы также можем программно удалить либо какие-то отдельные, либо все данные сессии.