Оглавление

27. Аутентификация с помощью PHP. Создание Личного кабинета

В  разд  Защита содержимого папки паролем  мы  уже  рассматривали  аутентификацию  посетителей  при  помощи файла конфигурации сервера Apache .htaccess. В PHP существует свой способ аутентификации посетителей при помощи механизма сессий.


За механизм сессий в файле php.ini отвечают следующие директивы:
□ session.save_handler определяет место хранения данных сеанса:

session.save_handler = files


□ session.save_path  задает  путь  к  месту  хранения  данных  сеанса.  При  установке мы изменили значение "/tmp" на "c:/php5/tmp" и создали папку tmp в каталоге c:/php5:

session.save_path = "c:/php5/tmp"


□ session.use_cookies  включает  возможность  использования cookies  для механизма сессий. Если указано значение 1, то использование разрешено, если 0 — то запрещено:

session.use_cookies = 1


□ session.name определяет имя сеанса:

session.name = PHPSESSID

□ session.auto_start  задает  возможность  автоматического  запуска механизма работы с сеансами. Значение 0 запрещает запуск:

session.auto_start = 0

□ session.cookie_path определяет путь для установки в cookies сеанса:

session.cookie_path = /


□ session.cache_expire  устанавливает  время  жизни  для  кэшированных страниц сеанса в минутах:

session.cache_expire = 180


□ session.cookie_lifetime  определяет  время  жизни cookies  на  машине пользователя. Значение 0 указывает на то, что cookies будет удалено сразу после закрытия окна Web-браузера:

session.cookie_lifetime = 0


□ session.use_trans_sid  задает  возможность присоединения PHPSESSID к URL-адресам. Если указано значение 1, то использование разрешено, если 0 — то запрещено:

session.use_trans_sid = 1


Работа с механизмом сессий осуществляется следующим образом:
1.  Запускается сеанс.
2.  Регистрируются переменные сеанса.
3.  Используются переменные сеанса.

4.  Удаляются переменные сеанса.
5.  Сеанс закрывается.

 
Запустить сессию позволяет функция session_start():

session_start();


При  запуске  сессии  на  компьютер  пользователя  устанавливается cookies  с именем PHPSESSID и значением вида db711b560810e7f90d67a4c8e6a873af.

 
А  в  папке c:/php5/tmp  создается  временный  файл  с  именем sess_db711b560810e7f90d67a4c8e6a873af.

 
Если прием cookies отключен в настройках Web-браузера, то к любой ссылке будет добавлена следующая строка:
?PHPSESSID=db711b560810e7f90d67a4c8e6a873af


Если на странице имеется форма, то внутрь будет автоматически добавлено скрытое поле:

<input type="hidden" name="PHPSESSID" 
value="db711b560810e7f90d67a4c8e6a873af" />

 

При первом запуске будут установлены cookies, а имя сессии будет добавлено  в URL-адреса  для  всех  внутренних  ссылок.  Если cookies  разрешено  использовать, то в дальнейшем добавление к URL будет прекращено.

 
Поменять имя сеанса можно с помощью функции session_name():

session_name("Ivan");
session_start();


Теперь вместо имени PHPSESSID будет использоваться имя Ivan.


Зарегистрировать переменную внутри сеанса можно следующим образом:

$_SESSION["var1"] = 1;


Переменная сохраняется не в cookies пользователя, а в специальном файле на сервере.  В cookies  пользователя  сохраняется  только  переменная  с  именем PHPSESSID и значением вида db711b560810e7f90d67a4c8e6a873af.


Проверить существование переменной можно с помощью функции isset():

if (isset($_SESSION["var1"])) {
   echo "Переменная зарегистрирована";
}

 

Удалить переменную сеанса позволяет функция unset():

unset($_SESSION["var1"]);


Удалить сразу все переменные сеанса позволяет функция session_unset():


session_start(); // Запускаем сессию
session_unset(); // Удаляем все переменные
session_destroy(); // Удаляем идентификатор


По завершении сеанса сначала нужно удалить все переменные сеанса, а затем вызвать функцию session_destroy() для удаления идентификатора сеанса:

session_destroy();


Для примера создадим папку secure в папке C:\Apache2\htdocs. В этой папке создадим следующие файлы:
□ index.php — содержит форму для ввода логина и пароля (листинг 60);
□ secure.php — файл  с информацией  только для прошедших  аутентификацию пользователей (листинг 61);
□ exit.php — для завершения сеанса (листинг 62);
□ data.php — для хранения логина и пароля (листинг 63).

 

Листинг 60. Содержимое файла index.php

<?php
require_once('data.php');
$err = '';
if (isset($_POST['login']) && isset($_POST['passw'])) {
   $_POST['passw'] = md5($_POST['passw']);
   if ($_POST['login']===$enter_login && 
      $_POST['passw']===$enter_passw) {
      session_start();
      $_SESSION['sess_login'] = $_POST['login'];
      $_SESSION['sess_pass'] = $_POST['passw'];
      header('Location: secure.php');
      exit();
   }
   else {
      $err = '<span style="color: red"><b>';
      $err .= 'Логин или пароль введены неправильно!';
      $err .= '</b></span><br>';
   }
}
?>
<form action="index.php" method="POST">
 <div align="center" style="padding: 250px 0 0 0">
  <table border="0" cellspacing="0" width="200">
   <caption><b>Вход в систему</b></caption>
   <tr><td align="right"><b>Логин:</b></td>
   <td><input type="text" name="login"></td></tr>
   <tr><td align="right"><b>Пароль:</b></td>
   <td><input type="password" name="passw"></td></tr>
   <tr>
   <td align="center" colspan="2">
    <input type="submit" value="Войти">
  </td></tr></table>
  <?php echo $err; ?>
 </div>
</form>

 

Листинг 61. Содержимое файла secure.php

<?php
session_start();
require_once('data.php');
if (isset($_SESSION['sess_login']) && isset($_SESSION['sess_pass'])) {
   if ($_SESSION['sess_login']===$enter_login && 
         $_SESSION['sess_pass']===$enter_passw) {
      echo "Информация для прошедших аутентификацию<br><br>\n";
      echo '<a href="exit.php">Выйти из системы</a>\n';
   }
   else {
      header('Location: index.php');
      exit();
   }
}
else {
   header('Location: index.php');
   exit();
}
?>

 

Листинг 62. Содержимое файла exit.php

<?php
session_start();
session_unset(); // Удаляем все переменные
session_destroy();
header("Location: index.php");
?>

 

Листинг 63. Содержимое файла data.php

<?php
$enter_login = "login";
$enter_passw = "202cb962ac59075b964b07152d234b70";
?>

 

В  данном  примере  используется  только  один  логин (login)  и  пароль (123).  В  реальной  практике  для  каждого  пользователя  создается  свой  логин  и  пароль. Для хранения учетных записей используется файл или чаще всего база
данных. Если используется обычный файл (как в нашем случае), то он должен  содержать пароль  в  зашифрованном  виде,  а  сам файл должен быть недоступен через Интернет. В нашем примере файл data.php должен быть расположен в папке C:\php5\includes, а не в C:\Apache2\htdocs\secure.

Примечания:
  • Так  как  мы  устанавливаем  заголовки  ответа  сервера,  то  перед функцией session_start() не должно быть никаких операторов вывода. Даже пустая строка перед открывающим PHP-дескриптором (<?php) вызовет ошибку.
8
<< Меню >>  
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити