Аутентификация с помощью PHP. Создание Личного кабинета
В разд 4.4.13 мы уже рассматривали аутентификацию посетителей при по- мощи файла конфигурации сервера 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 — содержит форму для ввода логина и пароля (листинг 5.60);
? secure.php — файл с информацией только для прошедших аутентифика-
цию пользователей (листинг 5.61);
? exit.php — для завершения сеанса (листинг 5.62);
? data.php — для хранения логина и пароля (листинг 5.63).
Листинг 5.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>
Листинг 5.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();
}
?>
Листинг 5.62. Содержимое файла exit.php
<?php session_start();
session_unset(); // Удаляем все переменные
session_destroy();
header("Location: index.php");
?>
Листинг 5.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) вызовет ошибку.
Источник: Прохоренок Н. А. HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера. — 3-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2010. — 912 с.: ил. + Видеокурс (на CD-ROM) — (Профессиональное программирование)