Создание системы регистрации и авторизации пользователей через PHP + MySQL

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

Для чего нужна система авторизации

Для владельца сайта возможность регистрации пользователей — отличная возможность получить данные о них и предоставить взамен дополнительные возможности.

Разберем основные преимущества наличия системы регистрации:

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

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

Разбор основной модели и документов

В основу системы регистрации входит несколько шагов:

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

Все это можно представить в виде базовой модели:

  • user_id (int(000))
  • user_login (Qwerty)
  • user_password (12345qwerty)
  • user_hash (qwerty)
  • user_ip (по умолчанию 0)

Настройка сервера: как выбрать

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

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

Делаем систему регистрации PHP + MySQL

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

Создаем объект в MySQL

Создавать объект (систему хранения данных) рекомендуем на базе сервиса MySQL.

Для этого формируем небольшую таблицу для хранения будущих данных:

Название таблицы: site.test

(
user_id int(00) unsigned not null auto_increment,
user_login qwerty not null,
user_password 12345qwerty not null,
primary key (user_id)
)
engine = myisam
character set utf8
collate utf8_general_ci;

После пробуем добавить первую запись:

insert into test.users (user_login, user_password)
values (‘test’,’g67dbh983vi’)

То есть: test — логин, g67dbh983vi — пароль.

Обработка формы регистрации

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

В него нужно ввести следующий код:

<?
// Форма регистрации нового пользователя
// Подключаемся к базе данных
$link=mysqli_connect(«localhost», «mysql_user», «mysql_password», «testtable»);
if(isset($_POST[‘submit’]))
{$err = [];
// выполняем проверку логина
if(!preg_match(«/^[a-zA-Z0-9]+$/»,$_POST[‘login’]))
{$err[] = «Логин должен состоять из цифр, латинских букв: заглавных и строчных, знаков препинания»;}
if(strlen($_POST[‘login’]) < 3 or strlen($_POST[‘login’]) > 30)
{$err[] = «длина логина должна быть больше 8 символов»;}
// выполняем проверку дублирования логина на сайте
$query = mysqli_query($link, «SELECT user_id FROM users WHERE user_login='».mysqli_real_escape_string($link, $_POST[‘login’]).»‘»);
if(mysqli_num_rows($query) > 0)
{$err[] = «Этот логин уже используется другим пользователем»;}
// Ошибки не обнаружены, регистрируем нового пользователя, информацию сохраняем в базе данных
if(count($err) == 0)
{$login = $_POST[‘login’];
// Создаем двойное хеширование и избавляемся от лишних пробелов
$password = md5(md5(trim($_POST[‘password’])));
mysqli_query($link,»INSERT INTO users SET user_login='».$login.»‘, user_password='».$password.»‘»);
header(«Location: login.php»); exit();}
else
{print «<b>При регистрации нового пользователя произошли ошибки:</b><br>»;
foreach($err AS $error)
{print $error.»<br>»;}
}}?>
<form method=»POST»>
Логин <input name=»login» type=»text» required><br>
Пароль <input name=»password» type=»password» required><br>
<input name=»submit» type=»submit» value=»Войти»>
</form>

Настройка системы авторизации

Далее требуется создать документ login.html, который будет отвечать за авторизацию пользователя в системе сайта.

Важно! В документе прописан параметр session_start (), которые нужен для проверки: был ли ранее авторизован пользователю.

<?
// Система авторизации пользователя
// Генерируем случайную строку
function generateCode($length=8)
{$chars = «abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789 ><,./!&?»;
$code = «»;
$clen = strlen($chars) — 1;
while (strlen($code) < $length) {
$code .= $chars[mt_rand(0,$clen)];}
return $code;}
// Подключаемся к базе данных
$link=mysqli_connect(«localhost», «mysql_user», «mysql_password», «testtable»);
if(isset($_POST[‘submit’]))
{
// Поиск в базе данных запись, в которой имеется логин, который был введен пользователем
$query = mysqli_query($link,»SELECT user_id, user_password FROM users WHERE user_login='».mysqli_real_escape_string($link,$_POST[‘login’]).»‘ LIMIT 1″);
$data = mysqli_fetch_assoc($query);
// Далее сравниваем введенный пароль
if($data[‘user_password’] === md5(md5($_POST[‘password’])))
{
// Генерируем и шифруем случайное число
$hash = md5(generateCode(10));
if(!empty($_POST[‘not_attach_ip’]))
{
// В том случае, если пользователь привязан к IP-адрес
// Переводим его IP-адрес
$insip = «, user_ip=INET_ATON(‘».$_SERVER[‘REMOTE_ADDR’].»‘)»;
}
// Прописываем в базе данных хеш новой авторизации и IP-адрес
mysqli_query($link, «UPDATE users SET user_hash='».$hash.»‘ «.$insip.» WHERE user_id='».$data[‘user_id’].»‘»);
// Вставляем cookies
setcookie(«id», $data[‘user_id’], time()+60*60*24*30, «/»);
setcookie(«hash», $hash, time()+60*60*24*30, «/», null, null, true); // httponly !!!
// Далее переадресовываем браузер на новую страницу, которая необходима для проверки скрипта
header(«Location: check.php»); exit();
}
Else
{print «Логин и пароль не подходят. Попробуйте ввести данные снова»;}
}?>
<form method=»POST»>
Логин <input name=»login» type=»text» required><br>
Пароль <input name=»password» type=»password» required><br>
Привязать к IP-адресу (нерекомендуется) <input type=»checkbox» name=»not_attach_ip»><br>
<input name=»submit» type=»submit» value=»Войти»>
</form>

После создаем новый документ — check.php, в котором прописывается скрипт проверки данных:

<?
// Проверка
// Подключаемся к базе данных
$link=mysqli_connect(«localhost», «mysql_user», «mysql_password», «testtable»);
if (isset($_COOKIE[‘id’]) and isset($_COOKIE[‘hash’]))
{$query = mysqli_query($link, «SELECT *,INET_NTOA(user_ip) AS user_ip FROM users WHERE user_id = ‘».intval($_COOKIE[‘id’]).»‘ LIMIT 1″);
$userdata = mysqli_fetch_assoc($query);

if(($userdata[‘user_hash’] !== $_COOKIE[‘hash’]) or ($userdata[‘user_id’] !== $_COOKIE[‘id’])
or (($userdata[‘user_ip’] !== $_SERVER[‘REMOTE_ADDR’]) and ($userdata[‘user_ip’] !== «0»)))
{setcookie(«id», «», time() — 3600*24*30*12, «/»);
setcookie(«hash», «», time() — 3600*24*30*12, «/», null, null, true); // httponly !!!
print «Что-то пошло не так»;}
else
{print «Здравствуйте, «.$userdata[‘user_login’].». Система работает исправно!»;}
}
else
{print «Включите куки»;}
?>

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

3 комментария для “Создание системы регистрации и авторизации пользователей через PHP + MySQL

  • 12.09.2021 в 08:20
    Постоянная ссылка

    А есть более простой способ создать авторизацию на сайте?

  • 12.09.2021 в 08:58
    Постоянная ссылка

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

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

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