Вебмастер: как создать свой сайт

Php: основы использования – manual

Сессии являются простым способом хранения информации для отдельных пользователей
с уникальным идентификатором сессии. Это может использоваться для сохранения
состояния между запросами страниц. Идентификаторы сессий обычно отправляются
браузеру через сессионный cookie и используются для получения имеющихся данных
сессии. Отсутствие идентификатора сессии или сессионного cookie сообщает PHP о том,
что необходимо создать новую сессию и сгенерировать новый идентификатор сессии.

Сессии используют простую технологию. Когда сессия создана, PHP будет либо получать
существующую сессию, используя переданный идентификатор (обычно из сессионного
cookie) или, если ничего не передавалось, будет создана новая сессия. PHP заполнит
суперглобальную переменную $_SESSION сессионной информацией
после того, как будет запущена сессия. Когда PHP завершает работу, он автоматически
сериализует содержимое суперглобальной переменной $_SESSION
и отправит для сохранения, используя сессионный обработчик для записи сессии.

По умолчанию PHP использует внутренний обработчик files
для сохранения сессий, который установлен в INI-переменной session.save_handler.
Этот обработчик сохраняет данные на сервере в директории, указанной в конфигурационной
директиве session.save_path.

Сессии могут запускаться вручную с помощью функции session_start().
Если директива session.auto_start установлена
в 1, сессия автоматически запустится, в начале запроса.

Сессия обычно завершает свою работу, когда PHP заканчивает исполнять скрипт, но может
быть завершена и вручную с помощью функции session_write_close().

Замечание:

Сессии, использующие файлы (по умолчанию в PHP), блокируют файл сессии
сразу при открытии сессии функцией session_start() или
косвенно при указании session.auto_start.
После блокировки, ни один другой скрипт не может получить доступ к этому же файлу
сессии, пока он не будет закрыт или при завершении скрипта или при вызове функции
session_write_close().

Скорее всего это станет проблемой для сайтов, которые активно используют AJAX
и делают несколько одновременных запросов. Простейшим путём решить эту проблему
будет вызов функции session_write_close() сразу же как только
все требуемые изменения в сессии будут сделаны, предпочтительно ближе к началу работы
скрипта. Также можно использовать другой механизм сессии, который поддерживает
конкурентный доступ.

Похожее:  Пошаговая инструкция по работе с Telegram Ad Platform

1. Сессии в PHP

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

Использование сессий и cookies очень удобно и оправдано в таких приложениях как Интернет-магазины, форумы, доски
объявлений, когда, во-первых, необходимо сохранять информацию о пользователях на протяжении нескольких станиц, а,
во-вторых, своевременно предоставлять пользователю новую информацию.

1.2. Регистрация переменных сессии

Вообще говоря, регистрация переменных сессии осуществляется при помощи функции session_register.

Синтаксис:

  bool session_register(mixed name [,mixed...]);

Т.е. для того, чтобы зарегистрировать переменную, в которой хранится имя пользователя, указанное им при регистрации, мы
должны вызвать эту функцию следующим образом:

1.3. Закрытие сессии

После завершения работы с сессией сначала нужно разрегистрировать все переменные сессии, а затем вызвать функцию
session_destroy.

Синтаксис:

  session_destroy();


Способы разрегистрации сеансовых переменных различаются в зависимости от того, каким способом они были
зарегистрированы.

При включенном register_globals и использовании функции session_register разрегистрация
осуществляется при помощи функции session_unregister.

Синтаксис:

2. Cookies

Использование сookies удобно как для программистов, так и для пользователей. Пользователи выигрывают
за счет того, что им не приходится каждый раз заново вводить информацию о себе, а программистам сookies
помогают легко и надежно сохранять информацию о пользователях.


Cookies — это текстовые строки, хранящиеся на стороне клиента, и содержащие пары
“имя-значение”, с которыми связан URL, по которому браузер определяет нужно ли посылать cookies
на сервер.

2.1. Установка cookies

Установка cookies производится с помощью функции setcookie().

Синтаксис:

  bool setcookie (string name[, string value[, int expire
  [, string path[, string domain[, int secure]]]]])

Эта функция имеет следующие аргументы:

2.2. Пример простого приложения с cookies


Давайте создадим простой сценарий, подсчитывающий при помощи cookies количество обращений
посетителя к странице.

В cookie с именем counter будет храниться число посещений страницы пользователем:

2.3. Установка срока годности cookies

По умолчанию cookies устанавливаются на один сеанс работы с броузером, однако можно задать для
них более продолжительный срок существования. Это очень удобное и полезное свойство, поскольку в этом случае
пользователю не нужно предоставлять свои данные вновь при каждом посещении сайта.

Как уже говорилось, срок годности устанавливается в секундах относительно начала эпохи. В PHP существуют
функции time и mktime для работы с датой и временем, позволяющие переводить текущее
время в количество секунд с начала эпохи. Функция time просто переводит текущее системное время
в количество секунд, прошедших с начала эпохи.

Синтаксис:

  time();

Усовершенствованным вариантом функции time является функция mktime.

Синтаксис:

  int mktime ([int hour [, int minute [, int second [, int month 
  [, int day [, int year [, int is_dst]]]]]]])

Аргумент is_dst этой функции определяет, попадает ли эта дата в период летнего времени и может
принимать следующие значения:

  • -1 по умолчанию. Означает, что свойство не задано;
  • 0 временной интервал не приходится на период летнего времени;
  • 1 временной интервал приходится на период летнего времени.


Примеры установки сроки годности cookies:

2.5. Проблемы безопасности, связанные с cookies

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

  • установка области видимости cookies;
  • шифрование;
  • ограничение доступа для доменов;
  • отправка cookies по защищенному запросу.

Наилучшим решением является комплексное применение всех этих способов.

2.6. Установка области видимости cookie

Поскольку, по умолчанию, доступ к cookie происходит из корневого каталога, это может создать
“дыры” в системе защиты, так как cookie становятся доступными в любом подкаталоге этого каталога.
Ограничить доступ к cookie для всех страниц, кроме расположенных в конкретном каталоге, к примеру,
/web, можно следующим образом:

  setcookie("name", $value, "/web/");

Однако и в этом случае, к примеру, каталоги /web/index.php, /web1/page.html и т. д.
будут удовлетворять этому ограничению. Если такое положение также является нежелательным, можно ограничить
область видимости cookie до конкретной страницы:

  setcookie("name", $value, "/web/index.php");

Однако и такой способ в полной мере не решает проблему, так как в этом случае доступ к информации, содержащейся
в cookie, может получить, к примеру, скрипт /web/index.php-script/anti_cookie.php.
Поэтому появляется необходимость в шифровании.

2.7. Шифрование

Применить шифрование к cookie можно разными способами, рассмотрим один из них:

2.8. Ограничение доступа для доменов


Для дополнительной безопасности, список доменов, имеющих доступ к cookie, должен быть ограничен.
Это можно сделать при помощи следующего кода:

Cookie в действии

Создание cookie

Cookie создаются вызовом функции setcookie(), сервер добавляет соответствующую строку в заголовок. Если вы попытаетесь послать cookie после того, как начнете посылать HTML, PHP отметит наличие серьезных ошибок, а cookie не будет размещен. Функция setcookie() принимает три основных параметра имя cookie, значение и дату окончания срока действия. Например:

setcookie("Ordering",$_POST['ChangeOrdering'], time() 31536000);

Использование Cookie

Cookies

Для установки Cookies используется функция SetCookie(). Для этой функции можно указать шесть параметров, первый из которых является обязательным:

Автоматический запуск сеанса

При необходимости применения сессий в приложении, есть возможность запускать сеанс автоматически без использования функции session_start.

В файле php.ini есть параметр session.auto_start, который позволяет запускать сеанс автоматически для каждого запроса. По умолчанию установлено значение 0 (выкл), и вы можете установить его на 1 (вкл), чтобы включить функцию автоматического запуска.

С другой стороны, если у вас нет доступа к файлу php.ini, и вы используете веб-сервер Apache, эту переменную можно задать с помощью файла .htaccess.

Если вы добавите строку выше в ваш .htaccess файл, то это должно автоматически запускать сессии в вашем PHP-приложении.

Возможность одновременной работы в одном браузере от имени нескольких пользователей

Последняя задача, которую хотелось бы рассмотреть — возможность одновременной работы в одном браузере нескольких пользователей. Эта возможность особенно полезна на этапе тестирования, когда нужно эмулировать одновременную работу пользователей, и желательно делать это в своем любимом браузере, а не использовать весь доступный арсенал или открывать несколько экземпляров браузера в режиме «инкогнито».

В наших предыдущих примерах мы не задавали явно имя сессии, поэтому использовалось имя, установленное в PHP по умолчанию (PHPSESSID). Это значит, что все сессии, которые создавались нами до сих пор, отправляли браузеру куки под именем PHPSESSID. Очевидно, что если имя куки всегда одинаковое, то нет возможности в пределах одного браузера организовать две сессии с одинаковым именем. Но если бы мы для каждого пользователя использовали собственное имя сессии, то проблема была бы решена. Так и сделаем.

Запоминаем пользователя в cookie

Чтобы пользователю не приходилось каждый
день вводить пароль (после того, как закончится сессия),
принято запоминать то, что он авторизован,
в куках (cookie).

Обычно куки устанавливаются на какой-то определенный срок (например, на месяц) или навсегда.
Во втором случае пользователь будет авторизован (то есть сможет входить на сайт без ввода пароля)
пока не перейдет по ссылке ‘Выйти’ или не зайдет с другого браузера (в нем-то куку мы не устанавливали!).

Как же это правильно реализовать?
Принцип такой: нужно записывать случайную строку в куки пользователя и одновременно в базу данных.

При заходе на сайт мы первым делом проверяем не запущена ли сессия.
Если запущена – значит пользователь авторизован.

Если не запущена, тогда мы смотрим ему в куки и ищем там пометку об авторизации.

Использование функции session_start

Метод, в котором сессия запускается функцией session_start, вы будете видеть часто.

Важно, чтобы функция session_start вызывалась в начале скрипта, перед отправкой чего-либо браузеру. В противном случае, вы столкнётесь с печально известной ошибкой Headers are already sent.

Как запустить сессию

В этом разделе мы обсудим, как запустить сессию в PHP.

Всякий раз, когда вы хотите поработать с переменными сеанса, необходимо убедиться, что сеанс уже запущен. Сеанс в PHP можно запустить несколькими способами.

Как изменять и удалять переменные сеанса

Можно изменять или удалять переменные сеанса, созданные ранее в приложении так же, как обычные переменные PHP.

Давайте посмотрим, как изменять переменные сессии.

Как получить идентификатор сессии

Как было сказано ранее, сервер создает уникальный номер для каждой новой сессии. Если вы хотите получить идентификатор сессии, вы можете использовать функцию session_id, как показано в следующем сниппете.

Это должно дать вам текущий идентификатор сессии. Функция session_id интересна тем, что она также может принимать один аргумент — идентификатор сессии. Если вы хотите заменить сгенерированный системой идентификатор сессии на свой собственный, вы можете предоставить его в качестве первого аргумента функции session_id.

Важно отметить, что, если вы хотите начать сессию с пользовательским идентификатором, функция session_id должна быть помещена перед вызовом session_start.

Куки и безопасность

Так как куки очень легко подделать или украсть,
то все критические действия со стороны авторизованного пользователя должны требовать введение пароля.

Это может быть удаление аккаунта, редактирование
какой-либо важной информации,
изменение пароля и другое.

Логаут


Дадим пользователю возможность нажать на кнопку ‘Выйти’ и перестать быть авторизованным.

Если раньше нам нужно было удалить только сессию,
то теперь следует удалить также и куки:

Заключение

В заключение приведу полный конечный код наших функций для работы с сессиями PHP, включающий все рассмотренные выше задачи.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *