Создаем невероятную простую систему регистрации на PHP и MySQL
Процесс создания системы регистрации – это довольно большой объем работы. Вам нужно написать код, который бы перепроверял валидность email-адресов, высылал email-письма с подтверждением, предлагал возможность восстановить пароль, хранил бы пароли в безопасном месте, проверял формы ввода и многое другое. Даже когда вы все это сделаете, пользователи будут регистрироваться неохотно, так как даже самая минимальная регистрация требует их активности.
В сегодняшнем руководстве мы займемся разработкой простой системы регистрации, с использованием которой вам не понадобятся никакие пароли! В результаты мы получим, систему, которую можно будет без труда изменить или встроить в существующий PHP-сайт. Если вам интересно, продолжайте чтение.
Давайте посмотрим, как эта простая система регистрации работает:
* У нас будет использоваться комбинированная форма авторизации/регистрации, где пользователи смогут вводить email и нажимать на кнопку подтверждения;* При подтверждении, если email-адрес не обнаружен в базе данных, в нее вносится новая запись. Генерируется случайная лексема и отправляется пользователю по email в виде кликабельной ссылки, которая будет действовать всего 10 минут;* Клик по ссылке во входящих сообщениях перекинет пользователя снова на страницу сайта. Система определит присутствие лексемы и авторизует пользователя.
Данный подход имеет следующие преимущества:
* Отсутствие необходимости валидировать пароли;* Отсутствие необходимости разрабатывать функцию хранения паролей, секретных вопросов и прочего;* Вы можете быть уверенными в том, что у вас останется способ контакта с пользователем, как только он впервые заходит на вашу страницу.
Однако есть и следующие недостатки:
* Безопасность основывается на безопасности почтового ящика человека. Если кто-то завладеет данными от его почтового ящика, то этот злоумышленник получит доступ и к этой системе. Конечно, подобная проблема существует и с функциями восстановления паролей по email, но вы просто должны об этом знать;* Email не защищен и может быть перехвачен. Учитывайте, что здесь, как и в случае с формой восстановления паролей, не используется HTTPS-передача данных, и данные могут быть перехвачены злоумышленником;* Пока вы не настроите исходящие сообщения, существует вероятность, что ваша система просто «заспамит» чей-то почтовый ящик;
Учитывая вышеприведенные преимущества и недостатки, наша система авторизации выходит довольно пригодной для использования, но не очень безопасной, поэтому мы рекомендуем вам использовать ее только в случаях регистрации на форумах, в зоне пользователей на сайте и сервисах, для которых не требуется какая-либо чувствительная информация.
Применение системы регистрации
В том случае, если вы просто хотите использовать нашу систему регистрации на вашем сайте, и не хотите изучать руководство, то вам нужно сделать следующее:
* Сначала нужно скачать вышеприведенный zip-файл;* В zip-файле найти файл tables.sql. Импортировать его в базу данных, используя опцию импорта в phpmyadmin. С другой стороны, вы можете открыть файл в текстовом редакторе, скопировать SQL и запустить его;* Откройте includes/main.php, и внесите туда данные для соединения с базой данных, а также комбинацию логин/пароль. В том же файле вам также нужно добавить email, который будет использовать в качестве отправителя сообщений. Некоторые веб-хостинги блокируют исходящие сообщения до тех пор, пока вы не укажите настоящий email-адрес, который можно создать при помощи панели управления этого же хостера;* Загрузите все необходимые файлы посредством FTP или других способов;* Добавьте предпоследний фрагмент кода (см. ниже) на каждую PHP-страницу, которые должны стать доступными только после авторизации;* Веселитесь!
Те, кто решил остаться с нами и дочитать статью до конца, предлагаем дальнейшую информацию:
Первый этап заключается в создании HTML-кода для формы авторизации. Следующий HTML-код находится в index.php. Этот файл также хранит в себе PHP-код, который отвечает за подтверждение формы и другие полезные функции нашей системы авторизации. Вы узнаете об этом подробнее в разделе с PHP-кодом.
В головной раздел мы включили основные таблицы стилей (они не представлены в руководстве, поэтому вам нужно будет открыть файл в редакторе, чтобы ознакомиться с ними). Перед закрывающих тегом body мы включили jQuery-библиотеку и файл script.js, разработкой которого мы займемся в следующем разделе статьи.
Теперь давайте займемся jQuery!
jQuery ожидает событие формы submit, запускает e.preventDefault(), и отправляет AJAX-запрос. В зависимости от ответа сервера, он отображает сообщение и предотвращает дальнейшее подтверждение.
assets/js/script.js
CSS-класс .loading добавляется к форме посредством Ajax-запроса в самом начале (это возможно благодаря методам ajaxStart() и ajaxComplete(), которые вы можете видеть практически в конце файла). Этот CSS-класс позволяет отобразить вращающийся индикатор, и вдобавок выступает в роли маркера, предотвращающего двойного подтверждения формы. Класс .loggedIn – это еще один маркер, который устанавливается как только email-сообщение будет отправлено. Он сразу же блокирует любые дальнейшие подтверждения.
Структура базы данных
Нашей простой системе регистрации понадобится 2 MySQL-таблицы (SQL-код вы можете видеть в файле tables.sql в zip-архиве). Первая таблица содержит пользовательские аккаунты, а вторая будет хранить данные о попытках авторизации.
Система не использует паролей, что приводит к отсутствию поля password в структуре. Здесь есть колонка token вместе с колонкой token_validity. Token (лексема) устанавливается, когда пользователь авторизуется в систему, и высылается на указанный пользователем email (подробнее об этом в следующем разделе). Затем token_validity устанавливается на 10 минут, после чего token станет недействительным.
Каждый раз, когда кто-нибудь пытается авторизоваться, во вторую таблицу вписывается новая запись. Как видно в нашем PHP-коде, благодаря этому у нас есть возможность реализовать ограничение количества попыток по IP-адресу. Мы устанавливаем ограничение в 10 попыток за 10 минут, и ограничение в 20 попыток в течение часа. Большее количество попыток приведет к блокировке IP-адреса.
В обеих таблицах IP-адрес хранится в виде целого числа с использованием PHP-функции ip2long .
Теперь мы готовы к тому, чтобы заняться кодом PHP. Основной функционал системы регистрации предоставляется классом User, который вы можете видеть ниже. Класс использует Idorm ( документация ), представляющую собой минималистскую библиотеку для работы с базами данных. Класс User отвечает за доступ к базам данных, генерирование token-ов для логина и их валидации. Он представляет нам простой интерфейс, который можно без труда включить в систему регистрации на ваших сайтах, основанных на PHP.
User.class.php
Token-ы генерируются при помощи алгоритма SHA1 , и сохраняются в базу данных. Мы используем функции даты и времени из MySQL для установки значения в колонку token_validity, равного 10 минутам. При валидации token, мы сообщаем движку, что нам нужен token, поле token_validity пока еще не истекло. Таким образом мы ограничиваем время, в течение которого token будет валиден.
Обратите внимание на то, что мы используем волшебный метод __get ( документация ) в конце документа, чтобы получить доступ к свойствам объекта user. Это позволяет нам осуществить доступ к данным, которые хранятся в базе данных в виде свойств: $user->email, $user->token. Для примера давайте посмотрим, как мы можем использовать этот класс в следующем фрагменте кода:
Еще один файл, в котором хранится необходимый функционал, это functions.php. Там у нас есть несколько вспомогательных функций, которые позволяют нам сохранить остальной код более опрятным.
Functions.php
Функции rate_limit и rate_limit_tick позволяют нам ограничивать число попыток авторизации на определенный промежуток времени. Попытки авторизации записываются в базу данных reg_login_attempt. Эти функции запускаются при проведении подтверждения формы авторизации, как можно видеть в следующем фрагменте кода.
Нижеприведенный код был взят из index.php, и он отвечает за подтверждение формы авторизации. Он возвращает JSON-ответ, который управляется кодом jQuery, который мы видели в assets/js/script.js.
При успешной авторизации или регистрации, вышеприведенный код отсылает email человеку с ссылкой для авторизации. Token (лексема) становится доступной в качестве $_GET-переменной 'tkn' ввиду сгенерированного URL.
Использование ссылки авторизации запустит этот код:
Запуск $user->login() создаст необходимые переменные для сессии, что позволит пользователю оставаться авторизованным при последующих входах.
Выход из системы реализуется примерно таким же образом:
В конце кода мы снова перенаправляем пользователя на index.php, поэтому параметр ?logout=1 в URL исключается.
Нашему файлу index.php также потребуется защита – мы не хотим, чтобы уже авторизованные пользователи видели форму. Для этого мы используем метод $user->loggedIn():
Наконец, давайте посмотрим, как можно защитить страницу вашего сайта, и сделать ее доступной только после авторизации:
protected.php
После этой проверки вы можете быть уверены в том, что пользователь успешно авторизовался. У вас также будет доступ к данным, которые хранятся в базе данных в качестве свойств объекта $user. Чтобы вывести email пользователя и их ранг, воспользуйтесь следующим кодом:
Здесь rank() – это метод, так как колонка rank в базе данных обычно содержит числа (0 для обычных пользователей и 1 для администраторов), и нам нужно преобразовать это все в названия рангов, что реализуется при помощи данного метода. Чтобы преобразовать обычного пользователя в администратора, просто отредактируйте запись о пользователе в phpmyadmin (либо в любой другой программе по работе с базами данных). Будучи администратором, пользователь не будет наделен какими-то особыми возможностями. Вы сами в праве выбирать, каким правами наделять администраторов.
На этом наша простенькая система регистрации готова! Вы можете использовать ее на уже существующем PHP-сайте, либо модернизировать ее, придерживаясь собственных требований.
Вам понравился материал? Поблагодарить легко! Будем весьма признательны, если поделитесь этой статьей в социальных сетях: