×
Закрытие
×

Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

Для скачивания исходных файлов необходимо авторизоваться под своим аккаунтом через соответствующую форму.

Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

  • Создаем сайт для работы в Интернете

    1. Причины создания пошаговой инструкции по разработке самописного сайта
    2. Тема создаваемого сайта
    3. В чем будет заключаться монетизация
    4. Функционал
    5. Этапы создания
    6. Текущее состояние создаваемого сайта

    Здравствуйте уважаемый посетитель!

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

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

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

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

    Следует к этому добавить, что при желании, после получения необходимых знаний и навыков в вопросах сайтостроения, вполне возможно заняться и созданием сайтов на заказ. Тем более, что эта работа очень интересна и достаточно хорошо оплачиваемая. И что немаловажно, ее можно выполнять удалено, занимаясь в любое время не выходя из дома. Для этого нужно всего лишь одно условие - подключение к сети Интернет, что в наше время не является какой-либо проблемой.

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

Самописный сайт своими руками!

Текущее состояние создаваемого сайта

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

Где в дополнительных материалах можно бесплатно скачать исходные файлы сайта с таблицами MySQL.

Вы здесь: Главная → Сборник статей → Авторизация  → Создаем систему авторизации пользователей


Автор: / Дата:

Создаем систему авторизации пользователей

Здравствуйте уважаемый посетитель!

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

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

Но это не единственная мера по защите конфиденциальности сессий, которые мы будем использовать в нашей системе авторизации. В следующей статье мы рассмотрим и другие способы защиты сессий от хакерских атак. Такие, как проверка браузера пользователя по HTTP-заголовку user-agent, привязка по IP-адресу, а также использование временных меток сессий.

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

Содержание


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

Создание сессии, ее переменных и cookies при успешной аутентификации пользователя


Ранее, при формировании обработчика формы авторизации мы создали отдельный файл "auth.php", в котором разместили PHP-код, выполняющий проверку введенных в форму логина и пароля с учетными записями, хранящихся в соответствующей таблице базы данных. А далее, в зависимости от результатов проверки, выполняли вывод сообщения о правильном или ошибочном вводе данных аккаунта пользователя.

А теперь дополним этот обработчик кодом, который вместо вывода сообщений будет обеспечивать все необходимые действия для авторизации пользователей. Ниже показан измененный PHP-код обработчика (файл auth.php) с выделенным светлым фоном новь созданного фрагмента.

  1. <?php

  2. require_once "start.php";

  3. if (!empty($_POST["auth-button"])) {

  4. //----Получение введенных в форму данных логина и пароля-------------

  5. if (isset($_POST["auth-login"])) $auth_login = $_POST["auth-login"];

  6. else

  7. $auth_login = $_POST["auth-login"];

  8. $auth_login = check_symbol($auth_login, "Логин", "1", "0");

  9. if (isset($_POST["auth-password"])) $auth_password = $_POST["auth-password"];

  10. else

  11. $auth_password = $_POST["auth-password"];

  12. $auth_password = check_symbol($auth_password, "Пароль", "1", "0");

  13. //----Извлечение хеш-строки из базы данных по логину из формы----

  14. $table = "orders";

  15. $column = "client-login";

  16. $value = $auth_login;

  17. $data_bd = getLine($table, $column, $value);

  18. $password_hash = $data_bd["password-hash"];

  19. echo nl2br("Извлеченный из базы данных хеш пароля: ".$password_hash. "\n\n");

  20. //----Формирование хеша пароля из формы-----

  21. $full_salt = substr($password_hash, 0, 29);

  22. $new_hash = crypt($auth_password, $full_salt.'$');

  23. //----Проверка на совпадение хеша пароля из формы с хеш-строкой из базы данных----

  24. if (!empty($password_hash) && $password_hash == $new_hash) { //При успешной аутентификации

  25. session_start(); //Создаем сессию

  26. $key1_hash = hash('sha256', microtime()); //Формируем одноразовый хеш-ключ

  27. setcookie ("key1", $key1_hash, time()+900, "/", $_SERVER['SERVER_NAME'], 0, 1); //Отправляем на сторону клиента cookie с созданным одноразовым ключем

  28. $_SESSION["key1"] = $key1_hash; //Записываем данные ключа в переменную сессии с именем "key1"

  29. $_SESSION['login'] = $auth_login; //Сохраняем в переменной сессии логин пользователя

  30. }

  31. else { //При неправильном вводе логина и/или пароля

  32. setcookie ("alert", "Неверные Логин и/или Пароль!", time()+60, "/", $_SERVER['SERVER_NAME']); //Передаем сообщение об ошибке

  33. }

  34. }

  35. //----Редирект на предыдущую страницу----

  36. header ("Location: ".$_SERVER["HTTP_REFERER"]);

  37. exit;

  38. ?>

Рис.1 Дополненный PHP-код обработчика формы авторизации (файл auth.php)

В данном фрагменте все строки кода сопровождаются комментариями. Но можно сделать еще некоторые дополнительные пояснения.

Формирование одноразового ключа здесь производится из текущего времени microtime() с помощью генерирования хеш-кода с алгоритмом хеширования "sha256" (поз.26).

При создании cookie "key1", предназначенной для одноразового ключа, время жизни длительностью в 900 секунд (15 минут) устанавливается с помощью функции setcookie() (поз.27). В которой одним из параметров в целях безопасности задан запрет доступа к cookie через скриптовые языки (JavaScript).

При этом, для сессии и сессионной cookie время жизни установлено с тем же значением в 900 секунд, но не в этом скрипте, а с помощью директив файл .htaccess. Ниже показан фрагмент файла .htaccess с добавлением настроек к существующим директивам, созданным ранее при рассмотрении общих вопросов в предыдущей статье (добавленные строки выделены светлым фоном).

  1. # Настройки параметров сессий

  2. php_value session.name SESSID

  3. php_flag session.cookie_httponly 1

  4. php_value session.gc_maxlifetime 900

  5. php_value session.cookie_lifetime 900

Рис.2 Установка времени жизни сессии и сессионной cookie в файле .htaccess

Таким образом при успешно пройденной аутентификации пользователя будут выполнены следующие действия:

  • создана новая сессия;
  • создан одноразовый ключ, предназначенный для дополнительной проверки подлинности пользователя;
  • отправлена cookie "key1" с одноразовым ключом на сторону клиента;
  • в переменную $_SESSION["key1"] созданной сессии записаны данные одноразового ключа.

Что касается неправильного ввода логина и/или пароля, то в этом случае вместо вышеперечисленных действий по созданию сессии, будет передано соответствующее сообщение в созданной для этого временной cookie с именем "alert" (поз.32). В дальнейшем, после вывода этого сообщения, данная cookie с устройства пользователя будет удалена.

По завершению работы обработчика с помощью функции header() отправляется HTTP заголовок с адресом, соответствующим предыдущей страницы (поз.36). А также прекращается выполнение текущего скрипта конструкцией exit (поз.37). И таким образом происходит перенаправление на страницу, с которой ранее выполнялась отправка формы авторизации.

Проверка наличия активной сессии и предоставление прав доступа при подтверждении легальности пользователя


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

  1. Проверку наличия сообщения об ошибке аутентификации, и при ее обнаружении вывод сообщения в диалоговом окне браузера.
  2. Проверку наличия активной сессии.
  3. При отсутствии сообщения об ошибке аутентификации и при наличии активной сессии:
    • 3.1.  Дополнительную проверку подлинности пользователя.
    • 3.2.  При подтверждении подлинности пользователя:
      • 3.2.1.  Формирование нового одноразового ключа.
      • 3.2.2.  Отправку на сторону клиента cookie со вновь созданным одноразовым ключом.
      • 3.2.3.  Запись вновь созданного ключа в соответствующую переменную сессии.
      • 3.2.4.  Формирования разрешающего флага авторизации (PHP-переменная с заданным значением), предназначенного для предоставления прав доступа к закрытым ресурсам сайта.
    • 3.3.  При не подтверждении подлинности пользователя.
      • 3.3.1.  Удаление сессионной cookie.
      • 3.3.2.  Удаление cookie с одноразовым ключом.
      • 3.3.3.  Удаление данных из переменных сессии.
      • 3.3.4.  Уничтожение сессии.
      • 3.3.5.  Вывод сообщения об ошибке в диалоговом окне браузера.
  4. Формирования запрещающего флага авторизации при наличии сообщения об ошибке аутентификации, отсутствии активной сессии, либо при не прохождении проверки подлинности пользователя.

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

А для того, чтобы это обеспечить, создадим отдельный файл в корневом каталоге сайта, например, с именем "check_auth.php", в котором разместим код соответствующего скрипта. А затем подключим его в начале шаблона главной страницы, аналогично тому, как ранее мы это делали с файлом "start.php".

  1. <?php

  2. require_once"start.php"; //Подключение файла start.php

  3. require_once"auth_check.php"; //Подключение файла auth_check.php

  4. . . .

  5. ?>

Рис.3 Подключение файла check_auth.php в начале шаблона главной страницы (index.php)

И таким образом при каждой загрузке страницы будет выполняться скрипт, выполняющий все вышеперечисленные действия. Ниже показан код, который необходимо разместить в файле "check_auth.php".

  1. <?php

  2. $session_check = 0; //Устанавливаем запрещающий флаг авторизации

  3. if (isset($_COOKIE['alert'])) { //При наличии cookie 'alert' с сообщением об ошибке

  4. $GLOBALS['alert'] = $_COOKIE['alert']; //Для вывода в диалоговое окно браузера записываем в глобальную переменную $GLOBALS['alert'] ообщения об ошибке

  5. setcookie ("alert", "", time()-60*60*24, "/", $_SERVER['SERVER_NAME']); //Удаляем cookie 'alert'

  6. }

  7. else {

  8. if (!empty($_COOKIE[ini_get('session.name')])) { //Если существует активная сессия

  9. session_start(); //Возобновляем сессию

  10. if (isset($_SESSION['key1'])) $session_key1 = $_SESSION['key1']; //Если переменная "key1" в сессии существует, то PHP-переменной $session_key1 присваивается ее значение

  11. else //Если нет

  12. $session_key1 = ""; //Переменной $session_key1 присваивается пустое значение

  13. if (isset($_COOKIE['key1'])) $cookie_key1 = $_COOKIE['key1']; //Если cookie "key1" существует, то PHP-переменной $cookie_key1 присваивается ее значение

  14. else //Если нет

  15. $cookie_key1 = ""; //Переменной $cookie_key1 присваивается пустое значение

  16. if ($session_key1 != "" && $cookie_key1 != "" && $session_key1 == $cookie_key1) { //Если одноразовый ключ сессии и cookie совпадают (подтверждение подлинности пользователя)

  17. $key1_hash = hash('sha256', microtime()); //Формируем одноразовый хеш-ключ

  18. setcookie ("key1", $key1_hash, time()+900, "/", $_SERVER['SERVER_NAME'], 0, 1); //Отправляем на сторону клиента cookie со вновь созданным одноразовым ключем

  19. $_SESSION["key1"] = $key1_hash; //Записываем данные ключа в переменную сессии с именем "key1"

  20. $session_check = 1; //Устанавливаем разрешающий флаг авторизации

  21. }

  22. else { //При не подтверждении подлинности пользователя

  23. setcookie(session_name(), session_id(), time()-60*60*24, '/'); //Удаляем сессионную cookie

  24. setcookie("key1", "", time()-60*60*24, "/", $_SERVER['SERVER_NAME'], 0, 1); //Удаляем cookie с одноразовым ключем

  25. session_unset(); //Удаляем данные из переменных сессии

  26. session_destroy(); //Уничтожаем сессию

  27. $GLOBALS['alert'] = 'Достоверность пользователя не подтверждена!\nВ целях безопасности текущая сессия закрыта!\nДля получения прав доступа необходимо вновь авторизоваться через соответствующую форму.'; //Записываем в глобальную переменную $GLOBALS['alert'] для вывода в диалоговое окно браузера сообщение об ошибке

  28. }

  29. }

  30. }

  31. ?>

Рис.4 Скрипт проверки авторизации (файл auth_check.php)

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

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

В нашем варианте передача сообщения о вводе неправильного логина и/или пароля происходит в cookie "alert", созданной в обработчике формы авторизации (файл auth.php). Поэтому, для того, чтобы сообщение вывести на экран браузера, в строке 4 данного скрипта его содержимое записывается в глобальную переменную $GLOBALS['alert']. Аналогично тому, как мы это делали ранее при выводе сообщений при неправильном вводе данных в формы.

А для того, чтобы такое сообщение могло быть обработано при каждом запросе (при загрузке любой страницы сайта), то в шаблон главной страницы следует добавить код, который будет обеспечивать вызов файла "alert.php", как показано на следующем фрагменте файла "index.php".

  1. . . .

  2. <body>

  3. <?php

  4. if (!empty($GLOBALSE['alert'])) { //При наличии сообщения об ошибке

  5. require_once"alert.php"; //Подключаем файл alert.php для вывода сообщения на экран браузера

  6. $GLOBALSE['alert'] = ""; //Очищаем сообщение

  7. }

  8. ?>

  9. <div "wrapper">

  10. . . .

Рис.5 Подключение файла alert.php в шаблон главной страницы (index.php)

Следует обратить внимание на то, что после записи сообщения из cookie "alert" в глобальную переменную $GLOBALS['alert'] (рис.4, поз.4), а также после подключения файла alert.php (рис.5, поз.5), следует удалить cookie "alert" (рис.4, поз.5) и очистить содержимое переменной $GLOBALS['alert'] (рис.5, поз.6). Иначе будет возникать вывод последующих ложных сообщений.

Таким образом мы сформировали еще один функциональный узел системы авторизации. Который при загрузке страницы определяет существование активной сессии, а при ее наличии, в зависимости от того, пройдена или нет дополнительная проверка подлинности пользователя, формирует разрешающий, либо запрещающий флаг авторизации (значении "1" переменной $session_check означает, что доступ разрешен, "0" - доступ запрещен).

И теперь те части закрытого контента сайта, которые должны предоставляться авторизованным пользователям, можно будет подключать с помощью условного оператора при значении переменной $session_check, равном "1".

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

Подключение блока меню авторизованного пользователя


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

Ниже показан фрагмент файла "aside.php", расположенного в папке "blocks" корневого каталога, где при разрешающем флаге авторизации (значение переменной $session_check равно "1") происходит такая замена (дополнения выделены светлым фоном).

  1. <div class="subscribe">

  2. <h3>Панель пользователя</h3>

  3. <?php

  4. if ($session_check == 1) { //При разрешающем флаге авторизации

  5. //Блок меню авторизованного пользователя

  6. ?>

  7. <ul>

  8. <li><a href="/user/account.html">Профиль</a></li>

  9. <li><a href="/user/order.html">Мои заказы</a></li>

  10. <li><a href="/user/add-order.html">Добавить заказ</a></li>

  11. </ul>

  12. <form name="logout" action="/logout.php" method="post">

  13. <input type="submit" name="logout-button" value="Выйти" >

  14. </form>

  15. <?php

  16. }

  17. else { //При запрещающем флаге авторизации

  18. //Блок формы авторизации

  19. ?>

  20. <form name="auth" action="/auth.php" method="post">

  21. <label for="auth-login"> Логин:</label>

  22. <input type="text" id="auth-login" name="auth-login" placeholder="Введите логин" required>

  23. <label for="auth-password"> Пароль:</label>

  24. <input type="password" id="auth-password" name="auth-password" placeholder="Введите пароль" required>

  25. <input type="submit" name="auth-button" value="Войти" >

  26. <div><a href="/user/login.html">Забыли логин?</a></div>

  27. <div><a href="/user/password.html">Забыли пароль?</a></div>

  28. </form>

  29. <?php

  30. }

  31. ?>

  32. </div>

Рис.6 Подключение блока меню авторизованного пользователя

Как видно, здесь в строке 4 условным оператором if проверяется значение переменной $session_check. И если оно равно "1", то при формировании динамической страницы будет размещен HTML-код блока меню авторизованного пользователя (поз.7÷14), представляющий собой список <ul> из трех элементов со ссылками вместе с формой "logout", предназначенной для ручного завершения сеанса.

Ниже на скриншоте показан вариант внешнего вида блока меню авторизованного пользователя, который выводится на страницу при подтверждении его подлинности (для авторизации здесь использован ранее созданный аккаунт с логином Audi387357 и паролем Z5nC89).

Отображение блока меню авторизованного пользователя

Рис.7 Отображение блока меню авторизованного пользователя

В случае же, если флаг авторизации будет запрещающий (значение переменной $session_check не будет равно "1"), то в предусмотренном месте будет размещен HTML-код существующего блока формы авторизации (поз.20÷28).

Отображение блока формы авторизации для неавторизованных пользователей

Рис.8 Отображение блока формы авторизации для неавторизованных пользователей

Очевидно, что таким же образом, используя флаг авторизации в виде переменной $session_check, можно управлять предоставлением доступа и к другим закрытым ресурсам сайта.

Автоматическое удаление сессии по истечение времени не активности


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

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

Кроме этого, так как мы установили время жизни и для cookies, то должны быть удалены из пользовательского устройства и все, относящиеся к сессии cookies.

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

Однако, следует учитывать, что удаление устаревших сессий из хранилища встроенным в PHP механизмом, так называемым "сборщиком мусора", имеет некоторые недостатки, заключающиеся в вероятностном характере его запуска, а именно:

  • На низко загруженных сайтах сессии могут не удаляться в течение желаемого времени.
  • На высоко загруженных сайтах сборка мусора может выполняться слишком часто.

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

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

Для задания вероятности запуска функции сборщика мусора имеется специальный параметр "session.gc_divisor". По умолчанию его значение равно 1000 (о том, как посмотреть текущие значения параметров сессий, рассказывалось в предыдущей статье). Это означает, что функция сборщика мусора будет запускаться в одном случае из тысячи.

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

В этом случае целесообразно значение этого параметра уменьшить, как показано в следующей таблице. Где в файл ".htaccess" добавлена еще одна директива, устанавливающая новое значение "session.gc_divisor", соответствующее вероятности 1 к 100 случаям открытия сессии (по усмотрению можно этот параметр установить и с другим значением).

  1. # Настройки параметров сессий

  2. php_value session.name SESSID

  3. php_flag session.cookie_httponly 1

  4. php_value session.gc_maxlifetime 900

  5. php_value session.cookie_lifetime 900

  6. php_value session.gc_divisor 100

Рис.9 Установка нового значения session.gc_divisor в файле .htaccess

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

В этом случае при очередном запуске сессии происходит проверка на достижения установленного таймаута с момента последней активности до текущего момента. И если время не активности превышено, то такая сессия принудительно уничтожается вместе с относящимися к ней cookies. Чем гарантировано достигается невозможность использования для авторизации такой устаревшей сессии, даже в тех случаях, если сборщик мусора вовремя не успел ее удалить.

Другой вариант, это использования отдельного скрипта, который проверяет время последней сборки мусора. А далее, по достижению установленного таймаута, запускается функция session_gc(), которая выполняет очередное удаление устаревших сессий. Что позволяет более оптимально использовать ресурсы сервера, не вызывая в пустую при каждом запросе вызов этой функции. И при этом не зависеть от вероятностного параметра "session.gc_divisor".

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

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

Выход - ручное завершение сеанса


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

По существу данный функционал должен выполнять те же самые действия по уничтожению сессии, которые ранее были определены для случая не подтверждения подлинности пользователя при проверке авторизации (рис.4, поз.23÷26), такие, как:

  • Удаление сессионной cookie.
  • Удаление cookie с одноразовым ключом.
  • Удаление данных из переменных сессии.
  • Уничтожение сессии.

Для размещения соответствующего скрипта создадим в корневом каталоге сайта новый файл с именем "logout.php". Следует обратить внимание на то, что имя файла должно совпадать с тем, которое указано в атрибуте action формы блока меню авторизованного пользователя (рис.6, поз.12).

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

  1. <?php

  2. session_start(); //Возобновляем сессию

  3. //----Уничтожение сессии вместе с относящимися к ней cookies----

  4. setcookie(session_name(), session_id(), time()-60*60*24); //Удаляем сессионную cookie

  5. setcookie("key1", "", time()-60*60*24, "/", $_SERVER['SERVER_NAME'], 0, 1); //Удаляем cookie с одноразовым ключем

  6. session_unset(); //Удаляем данные из переменных сессии

  7. session_destroy(); //Уничтожаем сессию

  8. //----Редирект на предыдущую страницу----

  9. header ("Location: ".$_SERVER["HTTP_REFERER"]);

  10. exit;

  11. ?>

Рис.10 Скрипт ручного закрытия сеанса (файл logout.php)

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

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

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

Исходные файлы сайта


Знак папкиИсходные файлы сайта с обновлениями, которые были сделаны в данной статье, можно скачать из прилагаемых дополнительных материалов:

  • Файлы каталога www
  • Таблицы базы данных MySQL

Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

Для скачивания исходных файлов необходимо авторизоваться под своим аккаунтом через соответствующую форму.

Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

С уважением, Николай Гришин


Комментарии


Если у Вас возникли вопросы, или есть какие-либо пожелания по представлению материала, либо заметили какие-нибудь ошибки, а быть может просто хотите выразить свое мнение, пожалуйста, оставьте свои комментарии. Такая обратная связь очень важна для возможности учета мнения посетителей.

Буду Вам за это очень признателен!

comments powered by HyperComments