PHP. что такое сессии и немного о куках
решил чуть чуть писать в блог немного и о кодинге.
сегодня поговорим о том, что из себя представляют и как работают сессии в языке PHP, зачем они нужны, как ими пользоваться, а так же что такое cookie и с чем едят эти "печеньки".
Cookie
Итак, начнём с файлов cookie, или куков.
это краткое описание куков с википедии. собственно, так оно и есть, куки это простые маленькие текстовые файлики, хранящиеся у клиента, которые может читать или устанавливать сервер или скрипт на странице, использующиеся для каких-нибудь операций.
Под какими-нибудь операциями обычно подразумеваются действия одного и того-же пользователя - например, в них хранится сессия, или настройки
Протокол HTTP построен на открытых стандартах, но однозначно определять пользователя он не умеет.
каждый запрос понимается как запрос какого-то нового пользователя, даже если уже текущий юзер просто, например, подгружает картинку на страницу.
Это было вполне терпимо для статических веб-страниц, но с приходом времён динамического веб-программирования потребовалось как-то идентифицировать пользователя.
Способ проверять каждого пользователя, например, по IP, не годится, так как в интернете тысячи прокси-серверов, через которые сидят десятки, а то и сотни человек, и у всех них один IP - IP прокси-сервера.
Тогда-то и был придуман механизм куков.
Сервер в качестве заголовка пересылает информацию, которой впоследствии воспользуется, например, сайты онлайн-плееры сохраняли в куках номер песни, которая играет сейчас, и время, когда было начато воспроизведение, чтобы при переходе на другую веб-страницу продолжить её (вообще, сейчас используется флеш, но оба способа изврещение... увы).
даже сайт вКонтакте использует куки, и хранит в них сессию и даже громкость звука встроенного плеера)) кстати, это говорит о том, что если пользователь переключит громкость, данные изменятся в cookie-записи локально (JavaScript) и не надо лишний раз нагружать сервер и клиента запросами, тем более, при воспроизведении песни.
Так как с помощью куков можно легко организовать простой механизм сессии, то есть можно получить информацию о страницах, посещённых пользователем, что влечёт за собой прямой взлом в личную жизь, пользователями (особенно европейцами), это нововведение было встречено с недовольством.
В результате, на куки были наложены жёсткие ограничения.
Во-первых, кроме создавшего куки домена никто больше не имеет к нему доступ-по умолчанию.
Во-вторых, в куки не хранится ниакая важная информация, хотя, это уже рекомендация к разработчикам.
В-третьих, куки можно установить время жизни, по прошествии которого она автоматически удалится, если такое время не установленно, то запись сессионная и исчезнет при закрытии браузера.
В-четвёртых, куки НЕ ЯВЛЯЮТСЯ исполняемыми файлами или программамми, и НЕ МОГУТ получить доступ к файлам пользователяю
В-пятых, каждый домен не может использовать более 20 килобайт куков, хотя это уже зависит от браузера, например, в Опере 30, в ОгнеЛисе 50...
И так далее...
кстати, история, то есть информация о страницах посещённых пользователем, и так сохраняется в log файлах сервера, если кому интересно, так что вторжение в личную жизнь уже давно состоялось)
*но некоторые параноики могут сидеть с прокси-серверов и отклюать куки, чтобы лишний раз не спалиться в интернете*
В PHP куки устанавливаются функцией setcookie(), и должны отправляться в заголовке документа, но лично я предпочитаю устанавливать их из JavaScript'a, просто потому, что на клинте удобней обработать динамически возникшую информацию, да и не хочется лишний раз нагружать сервер, которым, кстати, далеко не всегда можно воспользоваться.
Вот это, кстати, был пример того, как можно использовать куки сайта в совершенно разных целях, посему и не рекомендуют хранить в куках важную информацию, например, пароли пользователя - если такая запись попадёт в руки хакера, то он может запросто "угнать" аккааунт на сайте.
Каждый браузер, кстати, может и не получать куки, для этого надо всего-лишь изменить настройки, но без них современный интернет станет совершенно неюзабельным и неудобным<ю
Вообще, кукам, их установке и использованию в PHP и JavaScript будет посвящена отдельная статья, а сейчас я написал всё, что требовалось, для подробного разбора механизма работы сессий в PHP.
итак, сессии
сессии - это практически то же самое, что и куки, однако, они сохраняются в файле на сервере, либо в его оперативной памяти.
У клиента хранится идентефикатор сессии, и хранится он в сессионной cookie записи, то есть уничтожается, когда пользователь закрывает браузер.
Разумеется, юзер может выключить куки, но это нетрудно проверить, и передавать сессию от странице к странице, например, GET-запросом, но, при таком подходе, содержание идентификатора сессии будет видно в адресной строке браузера и случайный пользователь может перехватить её(то есть как-раз случайному пользователю-то глубоко плевать, но вот если вдруг некий хацкер мимо пройдёт?)
если он успеет воспользоваться сессионной переменной-идентификатором до-того, как та устареет, считайте, плакал ваш аккаунт..
Вот почему многие закрытые сайты требуют включения куков в браузерах своих пользователей.
У каждой сессии есть уникальнй идентификатор SID, который отправляется клиенту и хранится у него в куках.
Каждый раз, когда нужно идентифицировать пользователя, у него читается этот идентификатор, и по нему сервер определяет настройки для данного пользователя.
В сессии на сервере могут храниться какие-то переменные например, его ник, и по идентификатору можно получить эту переменную и, например, показать её на странице.
Разумеется, не стоит слишком доверять этому методу, так как можно украсть идентификатор сессии (например, с помощью кросс-сайтового скриптинга) и воспользоваться им, если он не устарел можно войти в чужой аккаунт аккаунт.
Чтобы не быть голословным, я сейчас подкреплю свои слова делом, а именно, напишем пару-тройку страниц, которые используют сессии.
Итак, создадим страницу, в которой будем сохранять переменную в сесии.
До вывода какого-либо HTML кода клиенту нам необходимо инициализировать сессию, то есть, попытаться прочитать у клиента SID, и еслим его нет, установить.
В PHP всё это делает функция session_start().
Установится он в cookie, а PHP пересылает cookie в заголовке документа, поэтому функцию установки сессии необходимо вызывать в самом начале, то есть до вывода каких-либо данных на страницу.
В этом примере перед вызовом функции session_start() стоит собачка @. в PHP это подавляет вывод возможных ошибок в окно браузера, и хоть её использование и не очень рекомендуется, для примера можно и забить.
(вторая причина - вывод ошибки в окошко клиенту не всегда есть гуд, даже, наоборот. это раздражает обычного посетителя, а вот, к примеру, хакеру, это как подарок на день рожденья ^^)
А вот теперь давайте запросим эту страничку с сервера.
Ничего не увидели (ну эт понятно, мы ж ничего не выводим в окно браузера)
однако, так ли это? в смысле, правда, совсем ничего? проверим ка куки...
мы видим, что установилась cookie-запись PHPSESSID, в которой хранится идентификатор сесии.
при каждом новом запросе проверяется, существует ли cookie PHPSESSID, и если её нет, она устанавливается. проверить это можно, если зайти с другого браузера, например.
Кстати, обратите внимание - время истечения для сессионной cookie не указано, то есть она будет жить до тех пор, пока вы не закроете окно браузера.
Если на сервере не установлены какие-то специальные настройки, то cookie будет жить там в оперативной памяти до тех пор, пока сервер не будет отключён, например
(настроить можно многое, например, можно хранить сессию в файле, если запросов много, а оперативки мало, например, или можно просто установить сессии время жизни, что-то порядка 20ти минут с момента последнего запроса)
Вернёмся к нашей страничке.
Для записи информации в сессионуую переменную используется функция session_register(), где в качестве параметра передаётся переменная, которую необходимо сохранить.
например,
но этот способ неудобный, и немного устарел (а к тому же ещё и небезопасен - требует глобальной видимости [о ней, тоже как-нибудь поговорим, наверное]), а мы с вами кодим по трушному (с выпендрёжем в том числе), так что так делать будем по-другому.
В PHP имеется несколько суперглобальных массивов, и мы заюзаем сейчас один из них - специально предназначеный для хранения информации о сессиях - $_SESSION.
Чтобы сохранить переменную username в массиве $_SESSION надо... да ничего не надо, просто возмём и сохраним её там =)
вот и все, никаких проблем, а тот устаревший и дурацкий способ даже не будем разбирать =) надо жить проще
теперь в файле сесии на сервере у нас хранится значение username, и мы можем им воспользоваться
Кстати, читать данные из сесии так же легко, как и записывать их туда, достаточно обратиться к массиву $_SESSION
перепишем немного нашу страничку
Посмотрим теперь на страничку в окне брузера - мы видим, что в переменной сессии сохранено то же значение, что и в переменной $user.
Собственно, это всё, что необходимо знать, но давайте чуток ещё поразвлекаемся с использованием сессий, вы ведь не против?
Получить значение идентификатора сесии можно с помощью функции session_id(), причём, если её вызвать до session_start() и передать параметр, то этот параметр и будет идентификатором сессии.
Удалить переменную сессии можно так же, как и обычную переменную - с помощью функции unset(), однако раньше (во времена римлян использования session_register()) использовали функцию session_unregister()
Проверить существование переменной можно так же стандартным способом, то есть, используя isset()
Закрыть сессию можно с помощью session_destroy()
А теперь перепишем слегка страничку с использованием некоторых из этих функций.
и создадим файл index1.php, в котором будут следующие строки


Тут мы видим результат работы нашего кода, SID, переменную username, и результат выполнения приведённых примеров.
На второй странице из сессии скрипт приветствует нас, называя по имени=)
Вот так можно легко организовать сессию простыми средствами PHP.
Если на первой странице мы нажмём выход, то увидем надпись "вы вышли", и, если после этого перейти на вторую страницу, то получим "вы не залогинены".. вот тк вот =) просто и красиво.
P.S. кстати, сессию можно организовать и самостоятельно, используя тот-же механизм
например, просто для того, чтобы изменить название cookie c PHPSESSID на что-то другое (хотя это можно сделать и так)
сегодня поговорим о том, что из себя представляют и как работают сессии в языке PHP, зачем они нужны, как ими пользоваться, а так же что такое cookie и с чем едят эти "печеньки".
Cookie
Итак, начнём с файлов cookie, или куков.
Ку́ки (от англ. cookie — печенье) — небольшой фрагмент данных, созданный веб-сервером или веб-страницей и хранимый на компьютере пользователя в виде файла, который веб-клиент (обычно веб-браузер) каждый раз пересылает веб-серверу в HTTP-запросе при попытке открыть страницу соответствующего сайта. Применяется для сохранения данных на стороне пользователя, на практике обычно используется для:
- аутентификации пользователя;
- хранения персональных предпочтений и настроек пользователя;
- отслеживания состояния сессии доступа пользователя;
- ведения статистики о пользователях.
это краткое описание куков с википедии. собственно, так оно и есть, куки это простые маленькие текстовые файлики, хранящиеся у клиента, которые может читать или устанавливать сервер или скрипт на странице, использующиеся для каких-нибудь операций.
Под какими-нибудь операциями обычно подразумеваются действия одного и того-же пользователя - например, в них хранится сессия, или настройки
Протокол HTTP построен на открытых стандартах, но однозначно определять пользователя он не умеет.
каждый запрос понимается как запрос какого-то нового пользователя, даже если уже текущий юзер просто, например, подгружает картинку на страницу.
Это было вполне терпимо для статических веб-страниц, но с приходом времён динамического веб-программирования потребовалось как-то идентифицировать пользователя.
Способ проверять каждого пользователя, например, по IP, не годится, так как в интернете тысячи прокси-серверов, через которые сидят десятки, а то и сотни человек, и у всех них один IP - IP прокси-сервера.
Тогда-то и был придуман механизм куков.
Сервер в качестве заголовка пересылает информацию, которой впоследствии воспользуется, например, сайты онлайн-плееры сохраняли в куках номер песни, которая играет сейчас, и время, когда было начато воспроизведение, чтобы при переходе на другую веб-страницу продолжить её (вообще, сейчас используется флеш, но оба способа изврещение... увы).
даже сайт вКонтакте использует куки, и хранит в них сессию и даже громкость звука встроенного плеера)) кстати, это говорит о том, что если пользователь переключит громкость, данные изменятся в cookie-записи локально (JavaScript) и не надо лишний раз нагружать сервер и клиента запросами, тем более, при воспроизведении песни.Так как с помощью куков можно легко организовать простой механизм сессии, то есть можно получить информацию о страницах, посещённых пользователем, что влечёт за собой прямой взлом в личную жизь, пользователями (особенно европейцами), это нововведение было встречено с недовольством.
В результате, на куки были наложены жёсткие ограничения.
Во-первых, кроме создавшего куки домена никто больше не имеет к нему доступ-по умолчанию.
Во-вторых, в куки не хранится ниакая важная информация, хотя, это уже рекомендация к разработчикам.
В-третьих, куки можно установить время жизни, по прошествии которого она автоматически удалится, если такое время не установленно, то запись сессионная и исчезнет при закрытии браузера.
В-четвёртых, куки НЕ ЯВЛЯЮТСЯ исполняемыми файлами или программамми, и НЕ МОГУТ получить доступ к файлам пользователяю
В-пятых, каждый домен не может использовать более 20 килобайт куков, хотя это уже зависит от браузера, например, в Опере 30, в ОгнеЛисе 50...
И так далее...
кстати, история, то есть информация о страницах посещённых пользователем, и так сохраняется в log файлах сервера, если кому интересно, так что вторжение в личную жизнь уже давно состоялось)
*но некоторые параноики могут сидеть с прокси-серверов и отклюать куки, чтобы лишний раз не спалиться в интернете*
В PHP куки устанавливаются функцией setcookie(), и должны отправляться в заголовке документа, но лично я предпочитаю устанавливать их из JavaScript'a, просто потому, что на клинте удобней обработать динамически возникшую информацию, да и не хочется лишний раз нагружать сервер, которым, кстати, далеко не всегда можно воспользоваться.
Вот это, кстати, был пример того, как можно использовать куки сайта в совершенно разных целях, посему и не рекомендуют хранить в куках важную информацию, например, пароли пользователя - если такая запись попадёт в руки хакера, то он может запросто "угнать" аккааунт на сайте.
Каждый браузер, кстати, может и не получать куки, для этого надо всего-лишь изменить настройки, но без них современный интернет станет совершенно неюзабельным и неудобным<ю
Вообще, кукам, их установке и использованию в PHP и JavaScript будет посвящена отдельная статья, а сейчас я написал всё, что требовалось, для подробного разбора механизма работы сессий в PHP.
СЕССИИ
итак, сессии
сессии - это практически то же самое, что и куки, однако, они сохраняются в файле на сервере, либо в его оперативной памяти.
У клиента хранится идентефикатор сессии, и хранится он в сессионной cookie записи, то есть уничтожается, когда пользователь закрывает браузер.
Разумеется, юзер может выключить куки, но это нетрудно проверить, и передавать сессию от странице к странице, например, GET-запросом, но, при таком подходе, содержание идентификатора сессии будет видно в адресной строке браузера и случайный пользователь может перехватить её(то есть как-раз случайному пользователю-то глубоко плевать, но вот если вдруг некий хацкер мимо пройдёт?)
если он успеет воспользоваться сессионной переменной-идентификатором до-того, как та устареет, считайте, плакал ваш аккаунт..
Вот почему многие закрытые сайты требуют включения куков в браузерах своих пользователей.
как работают сессии
У каждой сессии есть уникальнй идентификатор SID, который отправляется клиенту и хранится у него в куках.
Каждый раз, когда нужно идентифицировать пользователя, у него читается этот идентификатор, и по нему сервер определяет настройки для данного пользователя.
В сессии на сервере могут храниться какие-то переменные например, его ник, и по идентификатору можно получить эту переменную и, например, показать её на странице.
Разумеется, не стоит слишком доверять этому методу, так как можно украсть идентификатор сессии (например, с помощью кросс-сайтового скриптинга) и воспользоваться им, если он не устарел можно войти в чужой аккаунт аккаунт.
как пользоваться сессией
Чтобы не быть голословным, я сейчас подкреплю свои слова делом, а именно, напишем пару-тройку страниц, которые используют сессии.
Итак, создадим страницу, в которой будем сохранять переменную в сесии.
До вывода какого-либо HTML кода клиенту нам необходимо инициализировать сессию, то есть, попытаться прочитать у клиента SID, и еслим его нет, установить.
В PHP всё это делает функция session_start().
Установится он в cookie, а PHP пересылает cookie в заголовке документа, поэтому функцию установки сессии необходимо вызывать в самом начале, то есть до вывода каких-либо данных на страницу.
<?php @session_start(); //инициализация сессии //... какие-то действия ?>
В этом примере перед вызовом функции session_start() стоит собачка @. в PHP это подавляет вывод возможных ошибок в окно браузера, и хоть её использование и не очень рекомендуется, для примера можно и забить.
(вторая причина - вывод ошибки в окошко клиенту не всегда есть гуд, даже, наоборот. это раздражает обычного посетителя, а вот, к примеру, хакеру, это как подарок на день рожденья ^^)
А вот теперь давайте запросим эту страничку с сервера.
Ничего не увидели (ну эт понятно, мы ж ничего не выводим в окно браузера)
однако, так ли это? в смысле, правда, совсем ничего? проверим ка куки...мы видим, что установилась cookie-запись PHPSESSID, в которой хранится идентификатор сесии.
при каждом новом запросе проверяется, существует ли cookie PHPSESSID, и если её нет, она устанавливается. проверить это можно, если зайти с другого браузера, например.
Кстати, обратите внимание - время истечения для сессионной cookie не указано, то есть она будет жить до тех пор, пока вы не закроете окно браузера.
Если на сервере не установлены какие-то специальные настройки, то cookie будет жить там в оперативной памяти до тех пор, пока сервер не будет отключён, например
(настроить можно многое, например, можно хранить сессию в файле, если запросов много, а оперативки мало, например, или можно просто установить сессии время жизни, что-то порядка 20ти минут с момента последнего запроса)
Вернёмся к нашей страничке.
Для записи информации в сессионуую переменную используется функция session_register(), где в качестве параметра передаётся переменная, которую необходимо сохранить.
например,
<?php
@session_start(); //инициализация сессии
session_register("username"); /*сохраняем username
(на деле, при использовании данной функции это надо делать немного не не так, но для примера можно и забить) */
//... какие-то действия
?>но этот способ неудобный, и немного устарел (а к тому же ещё и небезопасен - требует глобальной видимости [о ней, тоже как-нибудь поговорим, наверное]), а мы с вами кодим по трушному (с выпендрёжем в том числе), так что так делать будем по-другому.
В PHP имеется несколько суперглобальных массивов, и мы заюзаем сейчас один из них - специально предназначеный для хранения информации о сессиях - $_SESSION.
Чтобы сохранить переменную username в массиве $_SESSION надо... да ничего не надо, просто возмём и сохраним её там =)
//например так... $user="admin"; //допустим, у нас есть некий user... $_SESSION['username']=$user; //или так... $_SESSION['username']="admin";
вот и все, никаких проблем, а тот устаревший и дурацкий способ даже не будем разбирать =) надо жить проще
итоговый код странички у нас теперь такой:
<?php
@session_start(); //инициализация сессии
//session_register("username"); -сохраняем username (закомментили, хлам^)
$_SESSION['username']="admin"; //сохраняем username
//... какие-то действия
?>теперь в файле сесии на сервере у нас хранится значение username, и мы можем им воспользоваться
Кстати, читать данные из сесии так же легко, как и записывать их туда, достаточно обратиться к массиву $_SESSION
перепишем немного нашу страничку
<?php @session_start(); //инициализация сессии $user="admin"; //username echo $user; //выведем username $_SESSION['username']=$user; //сохраняем username echo "<br/>"; //для удобства - перевод строки echo $_SESSION['username']; //выведем username из данных сессии //... какие-то действия ?>
Посмотрим теперь на страничку в окне брузера - мы видим, что в переменной сессии сохранено то же значение, что и в переменной $user.в заключение - выпендрёж =)
Собственно, это всё, что необходимо знать, но давайте чуток ещё поразвлекаемся с использованием сессий, вы ведь не против?
несколько полезных функций
Получить значение идентификатора сесии можно с помощью функции session_id(), причём, если её вызвать до session_start() и передать параметр, то этот параметр и будет идентификатором сессии.
Удалить переменную сессии можно так же, как и обычную переменную - с помощью функции unset(), однако раньше (во времена римлян использования session_register()) использовали функцию session_unregister()
Проверить существование переменной можно так же стандартным способом, то есть, используя isset()
Закрыть сессию можно с помощью session_destroy()
А теперь перепишем слегка страничку с использованием некоторых из этих функций.
<?php
@session_start(); //инициализация сессии
echo session_id()."<br/>"; //посмотрим SID + переведём строку...
$user="admin"; //username
echo $user."<br/>"; //выведем username
$_SESSION['username']=$user; //сохраняем username
echo $_SESSION['username']; //выведем username из данных сессии
if(isset($_SESSION['foo'])){ //проверяем существование несуществующей переменной
echo "<p>она существует! невозможное - возможно!</p>"; //если она есть
}else{
echo "<p>её нет... хнык... :'( </p>"; //если её нет
}
$_SESSION['foo']="<p>Я СУЩЕСТВУЮ! /foo </p>"; //создали переменную foo
$_SESSION['bar']="<p>Я ТОЖЕ! /bar </p>"; //и переменную bar
if(isset($_SESSION['foo']) && isset($_SESSION['bar'])) //если обе есть
echo $_SESSION['foo'], $_SESSION['bar']; //выводим
unset($_SESSION['bar']); //уничтожили bar
if(isset($_SESSION['bar'])){ //проверяем существование bar
echo "<p>она не умерла!<p>"; //если она есть
}else{
echo "<p>её нет... умерла... хнык... :'( жалко...</p>"; //если её нет
}
//... какие-то действия
?>
<a href="?logout=1">выход</a> | <a href="index1.php">другая страница</a>
<?php
if($_GET['logout']==1){ //если нажали выход
session_destroy(); //закрываем сессию
echo "вы вышли";
}
?>и создадим файл index1.php, в котором будут следующие строки
<?php @session_start(); echo isset($_SESSION['username']) ? "Здравствуйте, ".$_SESSION['username'] : "вы не залогинены!!"; ?>


Тут мы видим результат работы нашего кода, SID, переменную username, и результат выполнения приведённых примеров.
На второй странице из сессии скрипт приветствует нас, называя по имени=)
Вот так можно легко организовать сессию простыми средствами PHP.
Если на первой странице мы нажмём выход, то увидем надпись "вы вышли", и, если после этого перейти на вторую страницу, то получим "вы не залогинены".. вот тк вот =) просто и красиво.
P.S. кстати, сессию можно организовать и самостоятельно, используя тот-же механизм
например, просто для того, чтобы изменить название cookie c PHPSESSID на что-то другое (хотя это можно сделать и так)
Comments