Создание простой системы авторизации

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() часто также бывает неэффективно, поскольку существуют сервисы с базами хешей… но для нас главное было понять принцип построения системы авторизации, а строится она именно по такому принципу. Итак, урок окончен. До новых встреч.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *