Как сделать авторизацию php
Перейти к содержимому

Как сделать авторизацию php

  • автор:

Авторизация на PHP

Еще одна часто возникающая при создании серьезных сайтов задача – авторизация пользователей. В этой статье я расскажу как сделать авторизацию на сайте с разграничением прав доступа с помощью PHP и базы MySQL.
Начнем с создания таблицы users в базе данных. Минимальное количество полей – 4:

  1. id (smallint) – уникальный идентификатор пользователя (unique, auto_increment).
  2. username (varchar(255)) – имя пользователя
  3. password (varchar(255)) – md5 хеш пароля
  4. rights (varchar(1)) – права пользователя

Итак таблица создана, далее нам понадобится сама форма для авторизации:

Скрытое поле будет использовано для определения была ли передана форма. Переходим к логике самого скрипта. В самом начале страницы где необходима авторизация запускаем сессии session_start(). Далее проверяем авторизован ли пользователь, если нет, то выводим форму авторизации, если пользователь ввел имя пользователя и пароль – проверяем есть ли такой пользователь и пароль, если нет – опять выводим форму, если да – выводим содержимое страницы – все просто…

Так должен начинаться каждый файл, в котором необходима авторизация.
Теперь файл authorization.php:

function authorization($login, $password) <
//устанавливаем начальное значение авторизации
$user_login=FALSE;
//запрос к базе данных
$q=»SELECT * FROM users WHERE login=’$login'»;
$pass=md5($password);
$auth=mysql_fetch_assoc(mysql_query($q));
//проверяем, совпадают ли пары логин-пароль введенные пользователем с теми что в таблице users
if ($login==$auth[‘login’] and $pass==$auth[‘password’]) <
switch ($auth[‘rights’]) <
//пользователь с правами администратора
case ‘a’:
$_SESSION[‘user’]=’a’;
//ставим значение $_SESSION[‘auth’] TRUE, что соответствует входу зарегистрированного пользователя
$_SESSION[‘auth’]=TRUE;
$_SESSION[‘user_id’]=$auth[‘id’];
break;
//обычный пользователь
case ‘u’:
$_SESSION[‘user’]=’u’;
$_SESSION[‘auth’]=TRUE;
$_SESSION[‘user_id’]=$auth[‘id’];
break;
>
$_SESSION[‘username’]=$auth[‘login’];
$user_login=TRUE;
>
else if ($login!=$auth[‘login’]) <
$error_auth=»Неверный логин»;
$user_login=FALSE;
$_SESSION[‘auth’]=FALSE;
>
else if (md5($password)!=$auth[‘password’]) <
$error_auth=»Неверный пароль»;
$user_login=FALSE;
$_SESSION[‘auth’]=FALSE;
>
return $user_login;
>

Вот и все. Функция принимает в качестве обязательных параметров перменные $login и $password, возвращает перменную $user_login в значении TRUE если авторизация прошла успешно, и FALSE если нет. Стоит описать переменные, которые помещает функция в массив $_SESSION:
$_SESSION[‘user’] – права пользователя, a – администратор, u – простой пользователь.
$_SESSION[‘auth’] – TRUE или FALSE – прошла авторизация или нет.
$_SESSION[‘user_id’] – уникальный идентификатор пользователя – не обязательная переменная, иногда ее можно использовать в служебных целях, таких как учет записей добавленных пользователем, или время последнего редактирования записи этим пользователем.
Что дальше решать вам – где и как применять данную логику.

Как с помощью PHP и MySQL создать систему регистрации и авторизации пользователей

Безопасная система авторизации и регистрации является одним из важнейших элементов при создании проекта с нуля. Один из возможных способов — это создание системы регистрации с помощью PHP и MySQL .

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

Эта статья расскажет о том, как создать простую версию системы авторизации и регистрации пользователей с использованием PHP и MySQL для начинающих. Давайте начнем!

Обновлено: 2022-10-30 15:09:03 Вадим Дворников автор материала

Ресурсы, необходимые для работы с этим руководством:

  • Xampp ( PHP версии 5.3 или более поздней и MySQL версии 4.1.3 или более поздней );
  • Базовые знания по PHP , HTML и CSS ;
  • Время и терпение.

Что мы создаем

Что мы создаем

Настройка сервера

Вы можете использовать любой хостинг с поддержкой PHP и MySQL ( только убедитесь, что он поддерживает PHP версии 5.3 или более поздней и MySQL версии 4.1.3 или более поздней ).

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

Шаг 1 – MySQL

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

Взгляните на приведенный ниже код SQL :

/* Создание базы данных */ CREATE DATABASE userlistdb; /* Создание таблицы */ CREATE TABLE `usertbl` ( `id` int(11) NOT NULL auto_increment, `full_name` varchar(32) collate utf8_unicode_ci NOT NULL default '', `email` varchar(32) collate utf8_unicode_ci NOT NULL default '', `username` varchar(20) collate utf8_unicode_ci NOT NULL default '', `password` varchar(32) collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Обратите внимание, что все данные представляют собой varchar , и даже пароль позже будет преобразован в символ md5 , чтобы обеспечить его безопасность.

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

Теперь, когда таблица создана, нужно задать разметку и стили CSS , а затем PHP -код.

Шаг 2 — Разметка

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

Сначала создайте файл login.php . Скопируйте в него приведенный ниже код:

     Как с помощью PHP и MySQL создать систему регистрации и авторизации пользователей    

Вход

Имя опльзователя

Пароль

Еще не зарегистрированы?Регистрация!

© 2014 1stwebdesigner. Все права защищены.

С помощью этого кода вы получите результат, который показан на рисунке ниже:

Шаг 2 - Разметка

Далее, создаем файл register.php . Скопируйте и вставьте в него приведенный ниже код:

     Как с помощью PHP и MySQL создать систему регистрации и авторизации пользователей    

Регистрация

Полное имя

E-mail

Имя пользователя

Пароль

Уже зарегистрированы? Введите имя пользователя!

© 2014 1stwebdesigner. Все права защищены.

С помощью этого кода вы получите следующий результат:

Шаг 2 - Разметка - 2

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

 

Добро пожаловать, USER

!

Выйти из системы

Этот код даст нам следующий результат:

Шаг 3 — CSS

Теперь, когда разметка готова, нужно добавить 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

К этому времени, вы уже должны получить тот же результат, что и на изображении, приведенном в начале статьи.

Шаг 4 — Многоразово используемые элементы

Теперь, когда у вас готовы разметка и стили CSS , попробуйте задействовать такие многоразово используемые элементы, как раздел заголовка и раздел подвала. В корневой папке создайте новую папку и назовите ее “ includes “.

В ней будут содержаться все включаемые файлы. Затем в папке includes создайте новый файл и назовите его header.php . Скопируйте часть раздела заголовка в каждый из трех PHP -файлов, созданных нами ранее. Таким образом, у вас получится:

Как с помощью PHP и MySQL создать систему регистрации и авторизации пользователей

Следующее, что вам нужно сделать, это удалить разметку, скопированную из файла header.php во всех трех PHP -файлах и заменить ее следующим PHP -кодом:

Теперь, сделайте то же самое с подвалом. Скопируйте приведенный ниже код и вставьте его в новый файл footer.php . Он будет включать в себя раздел подвала:

© 2014 1stwebdesigner. Все права защищены.

Затем снова удалите эту часть во всех трех файлах PHP и замените ее следующим кодом:

Шаг — 5 Подключение к базе данных

Теперь, когда вы включили файлы разделов заголовка и подвала, пора создать новый включаемый файл. Назовите его constants.php и скопируйте в него следующий код:

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

Далее, в папке includes создайте новый файл и назовите ее connection.php . В нем будут храниться коды подключения к базе данных. Скопируйте и вставьте в него код, приведенный ниже:

Обратите внимание, что вам обязательно требуется файл constants.php . Если при подключении возникнет ошибка, с его помощью будет остановлено выполнение скрипта и выдано сообщение об ошибке.

Включите файл connection.php в файлах login.php и register.php , так как эти два файла необходимы для кода управления подключением. Скопируйте приведенный ниже код и вставьте его перед включением файла header.php :

Шаг — 6 Конфигурация файла register.php

Теперь необходимо преобразовать форму регистрации в полноценную систему регистрации. Чтобы сделать это, нужно добавить включение еще нескольких файлов PHP после включения header.php . Скопируйте и вставьте приведенный ниже код в файл register.php :

 else < $message = "Failed to insert data information!"; >> else < $message = "That username already exists! Please try another one!"; >> else < $message = "All fields are required!"; >> ?> " . "MESSAGE: ". $message . "

";> ?>

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

Шаг — 7 Конфигурация файла login.php

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

    if(isset($_POST["login"])) < if(!empty($_POST['username']) && !empty($_POST['password'])) < $username=htmlspecialchars($_POST['username']); $password=htmlspecialchars($_POST['password']); $query =mysql_query("SELECT * FROM usertbl WHEREusername='".$username."' AND password='".$password."'"); $numrows=mysql_num_rows($query); if($numrows!=0) < while($row=mysql_fetch_assoc($query)) < $dbusername=$row['username']; $dbpassword=$row['password']; >if($username == $dbusername && $password == $dbpassword) < // старое место расположения // session_start(); $_SESSION['session_username']=$username; /* Перенаправление браузера */ header("Location: intropage.php"); >> else < // $message = "Invalid username or password!"; echo "Invalid username or password!"; >> else < $message = "All fields are required!"; >> ?>

В приведенном выше коде, перед перенаправлением пользователя на страницу intropage.php , которую мы добавим чуть позже, вы в первую очередь должны проверить, была ли установлена сессия .

В противном случае, если сессия не была установлена, пользователю с помощью переменной message будет выдаваться сообщение об ошибке или он будет перенаправляться на страницу login.php .

Шаг — 8 Конфигурация файла intropage.php

Мы установили все, что нужно для файлов register.php и login.php . Теперь вы просто должны обеспечить, чтобы пользователь оставался в системе при перенаправлении на страницу intropage.php . Скопируйте и вставьте приведенный ниже код в файл intropage.php :

Добро пожаловать, !

Выйти из системы

Обратите внимание, что оператор if был создан для проверки, установлена ли сессия, и в зависимости от этого должен ли пользователь перенаправляться на страницу login.php или остаться на странице intropage.php .

Шаг — 9 Конфигурация файла logout.php

Наконец, чтобы пользователь мог выйти из системы, нужно удалить сессию с помощью session_destroy .

Скопируйте данный код в файл logout.php :

Заключение

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

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

Надеюсь, вам понравилась эта статья. Увидимся в следующий раз!

Комментарии

Оставьте свой комментарий
Вы вошли как | Выйти

пришлось покапать чтобы заработало, вот моя редакция кода:
обработчик register.php
if(isset($_POST[«register»])) if(!empty($_POST[‘full_name’]) && !empty($_POST[’email’]) && !empty($_POST[‘username’]) && !empty($_POST[‘password’])) $full_name= htmlspecialchars($_POST[‘full_name’]);
$email=htmlspecialchars($_POST[’email’]);
$username=htmlspecialchars($_POST[‘username’]);
$password=htmlspecialchars($_POST[‘password’]);
$query=mysql_query(«SELECT * FROM user WHEREusername='».$username.»‘»);
$numrows=mysql_num_rows($query);
if($numrows==0)
$sql=»INSERT INTO user
(full_name, email, username,password)
VALUES(‘».$full_name.»‘,'».$email.»‘, ‘».$username.»‘, ‘».$password.»‘)»;
$result=mysql_query($sql);
if($result) $message = «Account Successfully Created»;
>
else $message = «Failed to insert data information! SQL query:».$sql;

>
>
else $message = «That username already exists! Please try another one!»;
>
>
else $message = «All fields are required!»;
>
>
?>

обработчик login.php
session_start();
if(isset($_SESSION[«session_username»])) header(«location:index.php»);
>

require_once(«includes/bd.php»);
?>
if(isset($_POST[«login»])) if(empty($_POST[‘username’]) or empty($_POST[‘password’])) echo «All fields are required!»;
>
else $username=htmlspecialchars($_POST[‘username’]);
$password=htmlspecialchars($_POST[‘password’]);
$query =mysql_query(«SELECT * FROM user WHERE username='».$username.»‘ AND password='».$password.»‘»);
$numrows=mysql_num_rows($query);
if($numrows!=0)
$_SESSION[‘session_username’]=$username;
/* Перенаправление браузера */
if(isset($_SESSION[«session_username»])) echo »;

md5 шифрование так и не нашел в коде ��

Как добавить $hashed_password

Bastiras S.

Объясните новичку, как работает система донатов на сайте, как её создать и подключить к базе данных, и как менять цену на игровую валюту, буду очень благодарен!

скрипты полностью рабочие до версии php 5.5
а улучшить напиши функцию для удаление нежелательных тегов типа и и экранирование если проскочили для начала
для поля user_login
и пару проверок смысл пихать полностью голый код народ приходит правит в итоге проЁ пароли от мыл и на главной странице (_!_) если комедию русскою смотрел по хоттабыча то в курсе и писать надо что какая функция делает а не пихать от болды if($numrows==0) //проверяем равна она нулю или нет если не равна идем дальше если равна значит пустая выводим ошибку

где есть подключение к бд или работа с бд надо добавить букву i
например
mysql_query устаревшая
новая mysqli_query
читаем тут https://www.php.net/manual/ru/
валидатор https://phpcodechecker.com

Объясните пожалуйста шаг 4. Зачем заменять на header.php? А в footer.php только копирайт.

пожауйста скиньте исходник. не могу разобраться с кодом!

В коде несколько ошибок. Так что тупое копирование- не поможет
1. Прошло несколько лет, поэтому у некоторых выйдет ошибка про mysql.
решение: меняйте в файлах mysql_. на mysqli_
2. Синтаксические ошибки: в файлах login.php и register.php написан код, вот кусок «WHEREusername=»
решение: поставьте пробел после WHERE
3. В файле register.php , в последней строке нет экранирования.
решение: вместо пишите /> 4. У некоторых отключена регистрация пользователя root в базу mysql.
Решение: создать пользователя и пароль для работы с базой и указать его в файле constants.php, заодно поменять содержимое на такое:
$host = «localhost»;
$username = «my_user»;
$password = «my_password»;
$db_name = «userlistdb»;
?>
и поменять содержимое файла includes/connection.php на такое (в коде я уже поменял mysql_. на mysqli_ . имейте это ввиду и поправьте если что):
require(«constants.php»);
$link = mysqli_connect(«$host», «$username», «$password»)or die(«cannot connect server «);
mysqli_select_db($link,»$db_name»)or die(«cannot select DB»);
?>
5. У меня не происходило коннекта с базой данных, поэтому выходила ошибка.
Для теста явно указал данные для входа в mysql и все заработало. Надо подправить как включить файл connection.php в файлы.
Тестовое решение, в файле login.php перед $query прописать так:
$n1=mysqli_connect(«localhost»,»my_user»,»my_password»,»userlistdb»);
$query =mysqli_query($n1, «SELECT * FROM usertbl WHERE username='».$username.»‘ AND password='».$password.»‘»);
А в файле register:
также перед $query добавить строчку
$n1=mysqli_connect(«localhost»,»my_user»,»my_password»,»userlistdb»);
и далее, поправить на следующий код:
$numrows=mysqli_num_rows($n1,$query);
$result=mysqli_query($n1, $sql);

И только после этого всё заработало, как автор писал в статье:

Актуальность информации на 29.09.2018) Linux. Если нужна помощь, то пишите на почту infodr@ya.ru

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

Система авторизации с помощью cookie на PHP

loader

В прошлом уроке мы изучили механизм взаимодействия с cookie в языке PHP.

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

Техническое задание

Начнём мы это дело с описания будущей системы. Пусть у нас будут следующие компоненты:

  1. Главная страница сайта с каким-либо содержимым. Вверху страницы выводится:
    • если пользователь авторизован: Добро пожаловать, %username%.
    • если пользователь неавторизован: Авторизация — слово является ссылкой, которая ведёт на форму авторизации.
      Авторизован пользователь или нет, определяется с помощью cookie.
  2. Страница с формой авторизации. Два инпута для логина и пароля и кнопкой «Вход». Если введены правильные логин и пароль, устанавливаются cookie со значениями переданных данных, а затем пользователя автоматически редиректит (перенаправляет) на главную страницу.
  3. Страница для разлогинивания — при переходе на неё cookie будут удаляться из браузера пользователя, а затем выполняется редирект на главную страницу.

Решение

Продумываем архитектуру

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

  • Тест на знание основ HTML
  • Тест на знание основ PHP
  • Тест на знание ООП в PHP

Начнем с простого — для начала у нас должно получиться 3 странички, которые мы описали в ТЗ.

Ещё нам потребуется функционал, который будет проверять, авторизован ли пользователь. Если мы перечитаем ТЗ, то поймём, что он используется в двух местах — и на главной странице и на странице авторизации. Значит, стоит вынести этот механизм в отдельный файл, и использовать его в двух местах сразу.

Ну и наконец, нам где-то нужно хранить самих пользователей, а именно — их логины и пароли. Создадим для этого простенькую «базу данных» — массив, с набором пар логин-пароль. Это ещё один файл.

  • Разработчик 1000₽ — 3000₽
  • PHP разработчик 10000₽ — 15000₽
  • Full stack PHP+JS middle(8-20$/час) – испытательный срок максимум 12$ в час 8$ — 20$
  • Full stack PHP+JS junior ставка в час ( ученик в школу, 3-5$ ) 3$ — 5$
  • Front end middle PHP(минимум)+JS, верстка(6-16$ в час) — испытательный срок до 10$. Или senjor то ему 14-22$ в час. 6$ — 22$

Пишем код

Все исходники по данному заданию доступны здесь.

База данных

Ну вот, всё продумали, осталось только написать. Предлагаю начать с нашей базы данных. Создадим файл usersDB.php и запишем в него несколько пользователей.

 'admin', 'password' => 'P@ssw0rd'], ['login' => 'moderator', 'password' => 'password'], ['login' => 'user', 'password' => '123'], ];
Функции проверки авторизации

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

 > return false; >

В цикле мы пробегаемся по базе данных пользователей и пытаемся найти пользователя с переданными логином и паролем. Если такой пользователь в массиве найден — возвращаем true. Иначе — false.

Давайте теперь ещё напишем функцию, которая будет возвращать логин текущего пользователя. Эта функция будет проверять текущие значения cookie с ключами login и password с помощью уже существующей функции checkAuth. При этом если пользователь найдётся, то она вернёт его login, а иначе — null. Назовём эту нашу новую функцию getUserLogin.

//продолжение файла auth.php function getUserLogin(): ?string < $loginFromCookie = $_COOKIE['login'] ?? ''; $passwordFromCookie = $_COOKIE['password'] ?? ''; if (checkAuth($loginFromCookie, $passwordFromCookie)) < return $loginFromCookie; >return null; >

На этом всю логику проверки логина мы описали. Теперь займёмся непосредственно страничками.

Главная страница

Создадим файл index.php. Для простоты примера мы будем использовать только строку с приветствием авторизованного пользователя, либо ссылкой на авторизацию. В этой странице нам потребуется функция проверки авторизации через cookie, поэтому здесь нужно подключить файл auth.php.

   Главная страница   Авторизуйтесь Добро пожаловать,  
Выйти

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

Главная страничка с призывом авторизации

Форма авторизации

Давайте теперь сделаем форму авторизации — создаём файл login.php и для начала набрасываем саму HTML-форму. Шаблон получился следующим.

  Форма авторизации     

Давайте теперь добавим логику проверки переданных данных.

 else < $error = 'Ошибка авторизации'; >> ?>  Форма авторизации        

Логика простейшая — если был отправлен POST-запрос, проверяем правильные ли логин и пароль были переданы.

Если нет — то создаём переменную $error, в которой пишем об ошибке авторизации. Позже в шаблоне выводим эту ошибку, если эта переменная объявлена.

Если же авторизация прошла успешно, мы устанавливаем cookie с ключами login и password, в которые помещаем значения из POST-запроса. После этого выполняем редирект на главную страницу.

Редирект делается с помощью заголовка в HTTP-ответе. Этот заголовок называется Location и выглядит следующим образом:

Location: адрес_на_который_нужно_перейти

Для формирования заголовков в PHP используется функция header – ознакомиться с ней более детально вы можете здесь.

Теперь можно попробовать нашу страничку в действии. Давайте для начала введём несуществующую пару логина и пароля. Например, 123:123.

Ошибка при авторизации

Мы увидим соответствующую ошибку.

Теперь давайте зайдем под пользователем user. В нашей БД для него указан пароль 123. Пробуем.

Успешная авторизация

Успех! Нас автоматически перекинуло на главную страницу, где мы видим приветствие для данного пользователя!

Безопасная система авторизации

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

Хеширование паролей

В более совершенных системах авторизации используют хеш от пароля.

Если по-простому, то это такое вычисленное значение, полученное в результате выполнения над паролем определенных манипуляций. В результате этих действий мы получаем строку, из которой нельзя восстановить исходный пароль.

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

Для чего это делается? Да просто потому, что если сайт будет каким-то образом взломан, то злоумышленник в базе данных не найдёт паролей в открытом виде — только хеши. А так как из хеша получить пароль довольно сложно (при условии, что хеш-функция надежна и используется надёжный пароль), то пароль он не узнает. Следовательно:

  1. злоумышленник не сможет использовать пароль для входа на взломанный сайт;
  2. он также не сможет использовать этот пароль для входа под тем же логином и паролем в другие места (ведь довольно часто люди используют одинаковые пароли для всего).

Вычисляются хеши с помощью хеш-функции. Хеш-функции при этом вычисляют хеши следуя алгоритмам хеширования. Сейчас в PHP для хеширования следует использовать функцию password_hash(), а для проверки хеша — password_verify(). Если вы в каком-то уроке увидите, что для хеширования паролей используется md5 — бегите оттуда, такие хеши вскрываются за несколько минут, она устарела ещё лет 10 назад.

Авторизационные токены

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

И потом пользователь с помощью cookie передает этот токен на сервер, где он сравнивается со значением в базе данных. Если они равны, то считаем пользователя авторизованным. Для чего? Дело в том, что куки могут быть похищены злоумышленниками (очень многими способами, не будем об этом в этой статье, кому интересно — погуглите). И если злоумышленнику попадет в руки токен — он не сможет получить исходный пароль. О том, почему это так важно, я уже объяснил.

Заключение

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

Ах да, чуть не забыл, все исходники к каждому уроку я для вашего удобства буду выкладывать на github – вот тут.

Создание форм регистрации и авторизации на PHP

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

Обновлено: 2023-06-30 17:40:00 Наталья Кайда автор материала

Разработка форм регистрации и авторизации

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

Код регистрационной формы

Ниже приведен HTML-код необходимый для создания формы регистрации. Сохраните его вфайле register.php.

 

Несмотря на простоту данной формы, для проведения простейшей валидации данных в ней используется HTML5. К примеру, использование type=»email» обеспечит уведомление пользователя о том, что он неправильно ввел адрес электронной почты. Кроме того, применение pattern позволит провести проверку имени пользователя – логин может состоять только из латинских букв и цифр.

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

Исходный код страницы авторизации

HTML-код страницы входа в систему приведен ниже. Сохраните его в файле login.php .

 

CSS-стили для оформления форм

Для улучшения внешнего вида форм примените к ним следующие CSS-стили:

* < padding: 0; margin: 0; box-sizing: border-box; >body < margin: 50px auto; text-align: center; width: 800px; >h1 < font-family: 'Passion One'; font-size: 2rem; text-transform: uppercase; >label < width: 150px; display: inline-block; text-align: left; font-size: 1.5rem; font-family: 'Lato'; >input < border: 2px solid #ccc; font-size: 1.5rem; font-weight: 100; font-family: 'Lato'; padding: 10px; >form < margin: 25px auto; padding: 20px; border: 5px solid #ccc; width: 500px; background: #eee; >div.form-element < margin: 20px 0; >button < padding: 10px; font-size: 1.5rem; font-family: 'Lato'; font-weight: 100; background: yellowgreen; color: white; border: none; >p.success, p.error < color: white; font-family: lato; background: yellowgreen; display: inline-block; padding: 2px 10px; >p.error

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

Создание таблицы с учетными данными и подключение к базе данных

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

  1. Порядковый номер ID, который для каждого нового пользователя увеличивается автоматически.
  2. Уникальное имя пользователя.
  3. Адрес электронной почты.
  4. Пароль.

Для быстрого создания таблицы базы данных можно использовать следующий SQL-запрос:

CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(25) NOT NULL, `password` varchar(255) NOT NULL, `email` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

Теперь создайте файл config.php и сохраните в нем приведенный далее код для подключения к базе данных:

 catch (PDOException $e) < exit("Error: " . $e->getMessage()); > ?>

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

Исходный код для регистрации пользователей

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

Сохраните приведенный далее код в начале файла registration.php :

prepare("SELECT * FROM users WHERE email=:email"); $query->bindParam("email", $email, PDO::PARAM_STR); $query->execute(); if ($query->rowCount() > 0) < echo '

Этот адрес уже зарегистрирован!

'; > if ($query->rowCount() == 0) < $query = $connection->prepare("INSERT INTO users(username,password,email) VALUES (:username,:password_hash,:email)"); $query->bindParam("username", $username, PDO::PARAM_STR); $query->bindParam("password_hash", $password_hash, PDO::PARAM_STR); $query->bindParam("email", $email, PDO::PARAM_STR); $result = $query->execute(); if ($result) < echo '

Регистрация прошла успешно!

'; > else < echo '

Неверные данные!

'; > > > ?>

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

Далее, с помощью $_POST[‘register’] мы проверяем, нажал ли пользователь кнопку «Регистрация». Следует помнить, что пароли нельзя сохранять в виде незашифрованного текста. Поэтому наш код использует функцию password_hash() и сохраняет пароль в хэшированном виде. Эта функция записывает пароль в базу данных в виде хэш-строки, состоящей из 60 случайных символов.

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

Функция авторизации

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

Приведенный далее код должен располагаться в начале файла login.php:

prepare("SELECT * FROM users WHERE username=:username"); $query->bindParam("username", $username, PDO::PARAM_STR); $query->execute(); $result = $query->fetch(PDO::FETCH_ASSOC); if (!$result) < echo '

Неверные пароль или имя пользователя!

'; > else < if (password_verify($password, $result['password'])) < $_SESSION['user_id'] = $result['id']; echo '

Поздравляем, вы прошли авторизацию!

'; > else < echo '

Неверные пароль или имя пользователя!

'; > > > ?>

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

Как только мы получаем подтверждение правильности пароля, мы назначаем переменную $_SESSION[‘user_id’] для ID пользователя из базы данных. При необходимости на этом этапе передаются и значения для других переменных.

Ограничение доступа к страницам

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

 else < // Покажите пользователю страницу >?>

Все, что нужно сделать для ограничения или предоставления доступа – это использовать в начале приведенного выше скрипта строку session_start().

Типичные ошибки и способы их решения

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

Некорректное имя переменной

Чаще всего ошибки в работе скрипта связаны с неверными именами переменных – как правило, с использованием букв в неправильном регистре. Именно поэтому крайне важно придерживаться одного и того же шаблона при выборе имен. К примеру, ключи в функции $_POST основаны на значениях, полученных из полей ввода в формах. Это означает, что $_POST[‘USERNAME’] и $_POST[‘username’] получат разные значения.

«Заголовки уже отправлены»

Некоторые функции, например session_start() и header(), изменяют HTTP-заголовки. Поскольку PHP сбрасывает все заголовки перед выводом любых данных, важно вызывать все подобные функции до того, как вы начнете что-либо выводить – включая фрагменты сырого HTML или случайные пробелы перед открывающим тегом

Переменные сессии не сохраняются при переходах между страницами

Вы можете использовать переменные сессии только в том случае, если на странице осуществлен вызов функции session_start() . Если значения суперглобальной переменной $_SESSION вам не доступны, причина этого заключается в том, что вы забыли вызвать session_start() . Помните о том, что функцию надо вызывать перед выводом чего-либо на страницу сайта. В противном случае вы получите ошибку «Заголовки уже отправлены», рассмотренную выше.

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

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