Механизм сессий в PHP

В предыдущей статье мы рассмотрели принцип работы с куки в PHP. Назначение сессий практически такое же — сохранение некоторых данных после завершения работы скрипта для последующего использования. Однако, у двух этих методов есть существенное различие. Куки хранятся на стороне клиента и поэтому пользователь может без труда прочитать и даже изменять их. Допустим, на нашем сайте существует форма авторизации. Войдя под администраторской учетной записью пользователь получает дополнительные привилегии на сайте, к примеру, доступ к администраторской панели. Чтобы после каждого перехода пользователю не вводить заново пароль, необходимо каким-то образом запомнить факт того, что данный пользователь авторизован с административными правами. Используя куки задача решается следующим образом: после удачной авторизации пользователю устанавливается некая куки admin=1. При серфинге по страницам сайта проверяемся, есть ли у пользователя данная куки. Если есть, то пользователь — администратор. С точки зрения безопасности такое решение является в корне неправильным, так как любой посетитель может самостоятельно добавить в своем браузере куки admin=1 и автоматически стать администратором на вашем сайте. Используя сессии такой номер не пройдет, потому что сессионные параметры хранятся на стороне веб-сервера.

Рассмотрим принцип работы сессий в PHP. Для инициализации новой или возобновления ранее созданной необходимо вызвать PHP-функцию session_start(). Данную функцию необходимо вызывать до вывода контента в коде. Сессионные параметры находятся в глобальном массиве $_SESSION. Рассмотрим пример:

session_start();
if ( ! isset($_SESSION['test']) )
{
    echo 'Сохраняем значение...<br />';
    $_SESSION['test'] = 'Hello, world';
}
echo $_SESSION['test'];

При первом выполнении скрипта создастся новая сессия функцией session_start(). Условие выполнится, так как сессионной переменной test не существует и при этом будет создана данная сессионная переменная. При последующих выполнениях функция session_start() будет возобновлять ранее созданную сессию, условие выполняться не будет, а будет лишь выводиться значение переменной test.

При создании сессии PHP создает специальный временный файл, в котором хранит сессионные переменные. Для каждой сессии создается отдельный файл. Чтобы определить, какая сессия к какому клиенту относится, при создании сессии клиенту устанавливается куки вида:

PHPSESSID=be9657fa55a93d16d286234faf4ae56b

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

session.name = PHPSESSID

По умолчанию сессия уничтожается при закрытии клиентом браузера. Но можно задать и конкретное время жизни сессии в php.ini (указывается время в секундах):

session.cookie_lifetime = 0

В скрипте сессию можно принудительно уничтожить функцией session_destroy().

И напоследок рассмотрим еще один пример. Небольшой скрипт, эмулирующий авторизацию пользователя на сайте. Формы ввода логина и пароля нет, есть просто две кнопки "войти" и "выйти".

<?php
 
  //--Создаем новую либо возобновляем созданную сессию
  session_start();
 
  //--Процедуры входа и выхода
  if ( isset($_POST['do']) )
  {
      if ( $_POST['do'] == 'login' )
      {
          $_SESSION['logined'] = 'yes';
          header('location: ' . $_SERVER['PHP_SELF']);
          exit();
      }
      if ( $_POST['do'] == 'logout' )
      {
          session_destroy();
          header('location: ' . $_SERVER['PHP_SELF']);
          exit();
      }
  }
 
  //--Форма авторизации
  $login_form = <<<END
 
<form method="POST" action="{$_SERVER['PHP_SELF']}"> 
  <input type="hidden" name="do" value="login" />
  <input type="submit" name="submit" value="Войти" /> 
</form>
 
END;
 
  //--Форма выхода
  $logout_form = <<<END
 
<form method="POST" action="{$_SERVER['PHP_SELF']}"> 
  <input type="hidden" name="do" value="logout" />
  <input type="submit" name="submit" value="Выйти" /> 
</form>
 
END;
 
  //--Если пользователь авторизован
  if ( isset($_SESSION['logined']) && $_SESSION['logined'] == 'yes' )
  {
      echo 'Приветствуем Вас, авторизованный пользователь!<br />';
      //--Выводим форму выхода
      echo $logout_form;
  }
  else
  {
      echo 'Приветствуем Вас, гость!<br />';
      //--Выводим форму выхода
      echo $login_form;
  }
 
?>

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

Комментарии

Оставить комментарий »

 
Opossum
9 сентября 2011, 7:41
#1
 

Хочу куски кода так же вставлять в рамочки и с подсветкой синтаксиса

Joker-jar
9 сентября 2011, 8:29
#2
 

Это PHP-модуль Geshi, почитай о нем, поддерживает кучу синтаксисов. Я его адаптировал к своему движку :) Самому нравится.

888
6 декабря 2011, 2:25
#3
 

:)

Virbus
12 июля 2015, 21:34
#4
 

Спасибо за статью
Впервые узнал о таком операторе <<<
Где об этом почитать?

Подскажите пожалуйста как в
<input type="hidden" name="do" value="login" />
вместо value="login"
вставить $_SESSION['logined']

Оставить комментарий

Ваше имя
 
Ваш e-mail
 
Комментарий