The Logout script
Finally, Let’s create a logout.php file with the following code in it.
Step 1: creating a login form in html
Below is the Login Form in HTML. Paste it in a file named login.php
Step 1: creating registration form in html
We will create a PHP file named register.php with the following code in it. This is a simple HTML form with some basic validation. If you are not familiar with HTML then you can get it from many online sites who give ready-made html5 login form templates.
Активные сессии
Есть несколько путей реализации. Вы можете хранить всю нужную информацию
в специальной базе данных. Так что, когда сессия будет удалена сборщиком мусора,
вы должны это отслеживать и соответственно обновлять свою базу данных.
Самый простой способ – использовать идентификатор пользователя в качестве префикса
для идентификатора сессии и хранить всю требуемую информацию в $_SESSION.
Многие базы данных умеют достаточно быстро выбирать строки по префиксу.
Вы можете использовать session_regenerate_id() и
session_create_id() для этого.
Безопасность сессии
Оценка важности данных, передаваемых в рамках сессии, важна для выбора мер по
защите этой информации; все имеет свою цену и обычно дополнительные меры защиты
приводят к ухудшению удобства для конечного пользователя.
Например, если необходимо защитить пользователя от
простейших методов социальной инженерии, следует включить
session.use_only_cookies.
Существует несколько способов утечки существующего идентификатора сессии
третьим лицам. Например инъекции JavaScript, передача идентификатора
сессии в URL, перехват пакетов, физический доступ к устройству и т.д.
Перехваченный идентификатор сессии позволит третьим лицам получить
доступ ко всем ресурсам, связанным с данной сессией.
Во-первых,
передача идентификатора сессии в URL. При переходе на внешний сайт
идентификатор сессии пользователя и адрес ресурса могут попасть в статистику
переходов данного сайта. Во-вторых, при более активной атаке возможно
прослушивание сетевого трафика злоумышленником.
Если канал передачи данных не
зашифрован, идентификаторы сессии будут переданы в виде простого текста. В
таком случае решением является обязательное использование SSL/TLS пользователями
при доступе к сайту. Для этих целей следует применять HSTS.
Доводим до ума форму
В файл формы вначале «прикрепляем» обработчик. Затем проверяем, авторизирован пользователь или нет. Если да, то выводим для него кнопку окончания сессии. Если нет, то показываем форму:
Как с помощью php и mysql создать систему регистрации и авторизации пользователей
Безопасная система авторизации и регистрации является одним из важнейших элементов при создании проекта с нуля. Один из возможных способов – это создание системы регистрации с помощью PHP и MySQL.
Хотя в Интернете есть много пособий на эту тему, большинство из них предназначено для продвинутых пользователей.
Эта статья расскажет о том, как создать простую версию системы авторизации и регистрации пользователей с использованием PHP и MySQL для начинающих. Давайте начнем!
Скачать ZIP-архив
Вы можете использовать любой хостинг с поддержкой PHP и MySQL (только убедитесь, что он поддерживает PHP версии 5.3 или более поздней и MySQL версии 4.1.3 или более поздней).
Но в этой статье в качестве сервера будет использоваться Xampp. Если до этого не работали с Xampp, эта статья может помочь вам разобраться, как его должным образом установить на вашем компьютере.
Во-первых, создайте базу данных и таблицу, которая будет содержать все регистрационные данные. Вы можете сделать это вручную с помощью графического интерфейса пользователя PhpMyAdmin или использовать для вставки этой информации SQL.
Взгляните на приведенный ниже код SQL:
Обратите внимание, что все данные представляют собой varchar, и даже пароль позже будет преобразован в символ md5, чтобы обеспечить его безопасность.
Кроме того, используйте auto_increment для автоматического назначения идентификаторов или номеров пользователям, которые будут регистрироваться в системе.
Теперь, когда таблица создана, нужно задать разметку и стили CSS, а затем PHP-код.
Для разметки, нам нужно включить три файла, и все они должны быть сохранены в формате “.php“, так как мы создаем программу сценариев на стороне сервера.
Сначала создайте файл login.php. Скопируйте в него приведенный ниже код:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title> Как с помощью PHP и MySQL создать систему регистрации и авторизации пользователей</title>
<link href="css/style.css" media="screen" rel="stylesheet">
<link href= 'http://fonts.googleapis.com/css?family=Open Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>
</head>
<body>
<div class="container mlogin">
<div id="login">
<h1>Вход</h1>
<form action="" id="loginform" method="post"name="loginform">
<p><label for="user_login">Имя опльзователя<br>
<input class="input" id="username" name="username"size="20"
type="text" value=""></label></p>
<p><label for="user_pass">Пароль<br>
<input class="input" id="password" name="password"size="20"
type="password" value=""></label></p>
<p class="submit"><input class="button" name="login"type= "submit" value="Log In"></p>
<p class="regtext">Еще не зарегистрированы?<a href= "register.php">Регистрация</a>!</p>
</form>
</div>
</div>
<footer>
© 2022 <ahref="http://www.1stwebdesigner.com/">1stwebdesigner</a>. Все права защищены.
</footer>
</body>
</html>
С помощью этого кода вы получите результат, который показан на рисунке ниже:
Далее, создаем файл register.php. Скопируйте и вставьте в него приведенный ниже код:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title> Как с помощью PHP и MySQL создать систему регистрации и авторизации пользователей</title>
<link href="css/style.css" media="screen" rel="stylesheet">
<link href='http://fonts.googleapis.com/css?family=Open Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800'rel='stylesheet' type='text/css'>
</head>
<body>
<div class="container mregister">
<div id="login">
<h1>Регистрация</h1>
<form action="register.php" id="registerform" method="post"name="registerform">
<p><label for="user_login">Полное имя<br>
<input class="input" id="full_name" name="full_name"size="32" type="text" value=""></label></p>
<p><label for="user_pass">E-mail<br>
<input class="input" id="email" name="email" size="32"type="email" value=""></label></p>
<p><label for="user_pass">Имя пользователя<br>
<input class="input" id="username" name="username"size="20" type="text" value=""></label></p>
<p><label for="user_pass">Пароль<br>
<input class="input" id="password" name="password"size="32" type="password" value=""></label></p>
<p class="submit"><input class="button" id="register" name= "register" type="submit" value="Зарегистрироваться"></p>
<p class="regtext">Уже зарегистрированы? <a href= "login.php">Введите имя пользователя</a>!</p>
</form>
</div>
</div>
<footer>
© 2022 <ahref="http://www.1stwebdesigner.com/">1stwebdesigner</a>. Все права защищены.
</footer>
</body>
</html>
С помощью этого кода вы получите следующий результат:
Далее, создаем файл intropage.php. Он будет служить в качестве страницы приветствия после того, как пользователь успешно авторизовался в системе:
Этот код даст нам следующий результат:
Теперь, когда разметка готова, нужно добавить CSS-код. В основном, он будет содержать стили для класса страниц container, а также для кнопок и некоторых других элементов, таких как текстовые поля и лайки:
/*= ОБЩИЕ СТИЛИ
--------------------------------------------------------*/
body {
background: #efefef;
font-family: 'Open Sans', sans-serif;
color: #777;
}
a {
color: #f58220;
font-weight: 400;
}
span {
font-weight: 300;
color: #f58220;
}
.mlogin {
margin: 170px auto 0;
}
.mregister {
margin: 80px auto 0;
}
.error {
margin: 40px auto 0;
border: 1px solid #777;
padding: 3px;
color: #fff;
text-align: center;
width: 650px;
background: #f58220;
}
.regtext {
font-size: 13px;
margin-top: 26px;
color: #777;
}
/*= КОНТЕЙНЕРЫ
--------------------------------------------------------*/
.container {
padding: 25px 16px 25px 10px;
font-weight: 400;
overflow: hidden;
width: 350px;
height: auto;
background: #fff;
-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.13);
-moz-box-shadow: 0 1px 3px rgba(0,0,0,.13);
box-shadow: 0 1px 3px rgba(0,0,0,.13);
}
#welcome {
width: 500px;
padding: 30px;
background: #fff;
margin: 160px auto 0;
-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.13);
-moz-box-shadow: 0 1px 3px rgba(0,0,0,.13);
box-shadow: 0 1px 3px rgba(0,0,0,.13);
}
.container h1 {
color: #777;
text-align: center;
font-weight: 300;
border: 1px dashed #777;
margin-top: 13px;
}
.container label {
color: #777;
font-size: 14px;
}
#login {
width: 320px;
margin: auto;
padding-bottom: 15px;
}
.container form .input,.container input[type=text],.container input[type=password],.container input[type=e] {
background: #fbfbfb;
font-size: 24px;
line-height: 1;
width: 100%;
padding: 3px;
margin: 0 6px 5px 0;
outline: none;
border: 1px solid #d9d9d9;
}
.container form .input:focus {
border: 1px solid #f58220;
-webkit-box-shadow: 0 0 3px 0 rgba(245,130,32,0.75);
-moz-box-shadow: 0 0 3px 0 rgba(245,130,32,0.75);
box-shadow: 0 0 3px 0 rgba(245,130,32,0.75);
}
/*= КНОПКИ
--------------------------------------------------------*/
.button{
border: solid 1px #da7c0c;
background: #f78d1d;
background: -webkit-gradient(linear, left top, leftbottom, from(#faa51a), to(#f47a20));
background: -moz-linear-gradient(top, #faa51a, #f47a20);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#faa51a', endColorstr='#f47a20');
color: #fff;
padding: 7px 12px;
-webkit-border-radius:4px;
moz-border-radius:4px;
border-radius:4px;
float: right;
cursor: pointer;
}
.button:hover{
background: #f47c20;
background: -webkit-gradient(linear, left top, leftbottom, from(#f88e11), to(#f06015));
background: -moz-linear-gradient(top, #f88e11, #f06015);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f88e11', endColorstr='#f06015');
}
/*= ПОДВАЛ
--------------------------------------------------------*/
footer {
color: #777;
font-size: 12px;
text-align: center;
margin-top: 20px;
}
К этому времени, вы уже должны получить тот же результат, что и на изображении, приведенном в начале статьи.
Теперь, когда у вас готовы разметка и стили CSS, попробуйте задействовать такие многоразово используемые элементы, как раздел заголовка и раздел подвала. В корневой папке создайте новую папку и назовите ее “includes“.
В ней будут содержаться все включаемые файлы. Затем в папке includes создайте новый файл и назовите его header.php. Скопируйте часть раздела заголовка в каждый из трех PHP-файлов, созданных нами ранее. Таким образом, у вас получится:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title> Как с помощью PHP и MySQL создать систему регистрации и авторизации пользователей </title>
<link href="css/style.css" media="screen" rel="stylesheet">
<link href='http://fonts.googleapis.com/css?family=Open Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800'rel='stylesheet' type='text/css'>
</head>
<body>
Следующее, что вам нужно сделать, это удалить разметку, скопированную из файла header.php во всех трех PHP-файлах и заменить ее следующим PHP-кодом:
Теперь, сделайте то же самое с подвалом. Скопируйте приведенный ниже код и вставьте его в новый файл footer.php. Он будет включать в себя раздел подвала:
Затем снова удалите эту часть во всех трех файлах PHP и замените ее следующим кодом:
Теперь, когда вы включили файлы разделов заголовка и подвала, пора создать новый включаемый файл. Назовите его constants.php и скопируйте в него следующий код:
В приведенном выше коде, мы создали константы информации базы данных. Теперь мы можем легко изменять информацию всякий раз, когда это необходимо.
Далее, в папке includes создайте новый файл и назовите ее connection.php. В нем будут храниться коды подключения к базе данных. Скопируйте и вставьте в него код, приведенный ниже:
Обратите внимание, что вам обязательно требуется файл constants.php. Если при подключении возникнет ошибка, с его помощью будет остановлено выполнение скрипта и выдано сообщение об ошибке.
Включите файл connection.php в файлах login.php и register.php, так как эти два файла необходимы для кода управления подключением. Скопируйте приведенный ниже код и вставьте его перед включением файла header.php:
Теперь необходимо преобразовать форму регистрации в полноценную систему регистрации. Чтобы сделать это, нужно добавить включение еще нескольких файлов PHP после включения header.php. Скопируйте и вставьте приведенный ниже код в файл register.php:
В приведенном выше коде, обратите внимание, что перед добавлением данных в базу производится их валидация. Переменная message используется для хранения сообщения об ошибках или об успешном выполнении действия.
Теперь, когда пользователи могут регистрироваться на сайте, необходимо создать систему авторизации. С помощью этого очень простого PHP-кода, вы можете включить систему авторизации. Скопируйте код и вставьте его перед разметкой в файл login.php:
В приведенном выше коде, перед перенаправлением пользователя на страницу intropage.php, которую мы добавим чуть позже, вы в первую очередь должны проверить, была ли установлена сессия.
В противном случае, если сессия не была установлена, пользователю с помощью переменной message будет выдаваться сообщение об ошибке или он будет перенаправляться на страницу login.php.
Мы установили все, что нужно для файлов register.php и login.php. Теперь вы просто должны обеспечить, чтобы пользователь оставался в системе при перенаправлении на страницу intropage.php. Скопируйте и вставьте приведенный ниже код в файл intropage.php:
Обратите внимание, что оператор if был создан для проверки, установлена ли сессия, и в зависимости от этого должен ли пользователь перенаправляться на страницу login.php или остаться на странице intropage.php.
Наконец, чтобы пользователь мог выйти из системы, нужно удалить сессию с помощью session_destroy.
Скопируйте данный код в файл logout.php:
Сегодня мы узнали, как создать простую систему авторизации, используя PHP и MySQL. Конечно, существует много аспектов, которые нужно учитывать, когда речь идет о безопасности, но это уже неплохое начало.
Вы можете изменять приведенные в этой статье коды по своему усмотрению. Если у вас есть идеи по их улучшению, буду рад услышать об этом в комментариях.
Надеюсь, вам понравилась эта статья. Увидимся в следующий раз!
Мы это проходили
Да, этот процесс мы уже рассматривали в предыдущих материалах. Но мы ни разу не упоминали о такой важной составляющей, как сессии. С их помощью пользователь может после авторизации посещать все разделы ресурса, и не проходить данную процедуру на каждой странице. Рассмотрение темы о том, как сделать авторизацию на сайте PHP, было бы не полным без изучения возможностей сессий.
Начнем, как всегда, с формы. Вот ее разметка:
Неадаптивное управление сессиями
В настоящее время PHP использует адаптивное управление сессиями по умолчанию.
Адаптивное управление сессиями несёт дополнительные риски.
Обработчик с элементами ооп и бес субд
Вы не ослышались: сегодняшний скрипт авторизации на PHP будет без СУБД. Точнее, это сделано намеренно, чтобы акцентировать внимание на сессиях. А для обработчика мы создадим отдельный класс и наполним его специализированными функциями.
Все переменные сессии доступны через одноименный глобальный массив PHP $_SESSION. Для начала запускаем сессию и устанавливаем «правильную» кодировку:
Пересоздание идентификатора сессии
Использование session.use_strict_mode
– это хорошо, но недостаточно. Разработчик также должен использовать
session_regenerate_id() для обеспечения безопасности сессий.
Пересоздание идентификаторов сессий сильно уменьшает риск кражи сессии,
соответственно надо на периодической основе запускать
session_regenerate_id(). Например, пересоздавать идентификатор сессии
каждые 15 минут для особо секретных данных.
Идентификатор сессии должен пересоздаваться при
повышении привилегий пользователя, например при аутентификации.
Функция session_regenerate_id() должна вызываться до записи
авторизационной информации в $_SESSION.
(session_regenerate_id() сохраняет данные текущей сессии
автоматически). Убедитесь, что только текущая сессия отмечена как
авторизованная.
Разработчики НЕ ДОЛЖНЫ полагаться на механизм истечения срока действия
идентификатора сессии с помощью session.gc_maxlifetime.
Атакующие могут периодически получать доступ к сессии для
предотвращения её срока действия и продолжать использовать идентификатор жертвы,
включая аутентифицированные сессии.
Вместо этого, вы должны самостоятельно реализовать управление данными сессии
базируясь на временной метке.
session_regenerate_id() по умолчанию не
удаляет старые сессии. Устаревшие авторизованные сессии могут быть доступны
для использования. Разработчики должны пресечь любую возможность
использования старых сессий кем-либо, запретив доступ
к истёкшим сессиям самостоятельно, используя временные метки.
session.use_only_cookies
и правильное использование session_regenerate_id() могут
привести к персональной DoS посредством установки неудаляемой cookie.
Если такое происходит, то вы можете попросить
пользователя удалить cookie и предупредить его о возможных проблемах
с безопасностью.
Сессии и автоматический вход
Разработчики НЕ ДОЛЖНЫ использовать долгоживущие сессии для реализации
автоматического входа в систему, потому что это резко повышает вероятность
кражи сессии. Автоматический вход в систему должен реализовываться
разработчиком самостоятельно.
Стандартная авторизация
Авторизация на сайте является необходимой функцией. С ее помощью владелец ресурса может попасть в административную панель и скорректировать работу систему, а контентщик – опубликовать новый материал.
Кроме этого на многих сайтах пользователям предоставляют доступ к дополнительному функционалу, которым не могут воспользоваться обычные посетители (комментирование, размещение фотографий, специализированные инструменты). Для авторизации человек должен быть зарегистрирован в системе ресурса.
Удаление данных сессии
Данные истёкших сессий должны быть недоступны и удалены. Существующий
механизм управления сессиями делает это не очень хорошо.
Данные истёкших сессий надо удалять так быстро, как только возможно.
С другой стороны, данные активных сессий НЕ ДОЛЖНЫ удаляться сразу же.
Для обеспечения этих противоречивых требований, вы ДОЛЖНЫ самостоятельно
реализовать механизм контроля за истёкшими сессиями на базе
временных меток.
Устанавливайте и управляйте временными метками жизни сессии через $_SESSION.
Запрещайте доступ к данным истёкших сессий. Если обнаружена попытка доступа
к данным устаревшей сессии, снимайте статус авторизации со всех активных
сессий пользователя и вынуждайте его переавторизоваться.
Замечание:
Доступ к истёкшей сессии может также произойти из-за нестабильного
сетевого доступа и/или конкурентного доступа к приложению/сайту.
Сервер может попытаться установить новый идентификатор сессии через
cookie, но пакет “Set-Cookie” может не дойти до клиента из-за плохой связи.
Одно соединение может вызвать пересоздание идентификатора посредством
session_regenerate_id(), а другое, в то же время,
может не получить нового идентификатора.
Следовательно, вы должны запретить доступ к истёкшим сессиям чуть-чуть позже.
То есть управление сессиями на базе временных меток является обязательным.
Короче говоря, не уничтожайте данные сессии ни с помощью session_regenerate_id(),
ни session_destroy(), а используйте механизм
доступа к сессии на базе временных меток. Пусть session_gc()
сам удаляет старые сессии из хранилища.
Шаг 8
И последний штрих. Мы можем ограничивать доступ не только к странице админки, но и к любой другой. Для этого достаточно открыть сессию и проверить наличие метки в ней. Чтобы не копировать на каждую новую страницу эти блоки кода — мы их можем вынести в отдельный файл (auth.php) и затем просто подключать этот файл на страницах, к которым нужно ограничить доступ по паролю. Содержимое файла auth.php будет таким:
Заключение
На этом наш урок завершен, мы выполнили поставленную в уроке задачу — написали свою простенькую систему авторизации. Конечно, как говорилось выше, для серьезных проектов такая система авторизации мало подходит, поскольку пользователей у нас может быть больше одного и хранить их нужно в БД.
Да и шифрование пароля функцией md5() часто также бывает неэффективно, поскольку существуют сервисы с базами хешей… но для нас главное было понять принцип построения системы авторизации, а строится она именно по такому принципу. Итак, урок окончен. До новых встреч.