Как сделать авторизацию на сайте на PHP форма входа


Оглавление (нажмите, чтобы открыть):

Регистрация и авторизация

Принцип реализации

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

Авторизация и дальнейшее пребывание пользователя на сайте происходит по следующей схеме:

  1. Пользователь вводит логин и пароль в форму авторизации и отправляет на сервер.
  2. На сервере проверяется, есть ли в базе данных пользователь с таким логином и паролем.
  3. Если пользователь найден, то информация об этом записывается в сессию или куки.
  4. На страницах сайта происходит проверка — есть ли в сессии данные о том, что пользователь авторизован и в зависимости от этого страница выводится в том или ином виде.

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

Формы авторизации и регистрации

Форма авторизации обычно располагается на главной странице, либо она может быть на всех страницах сайта. Для формы регистрации, в основном, создаётся отдельная страница. Мы создадим всего одну страницу, на которой будут обе формы, и на неё же будут выводиться данные пользователя. Пока на ней будет только HTML код, но мы сразу сделаем PHP файл, потому что в дальнейшем это будет скрипт. Назовём его formreg.php. Код страницы будет такой:

Регистрация

Регистрационные данные пользователей мы будем записывать в таблицу users . Если у Вас ещё нет такой таблицы, то создайте её. В ней должны быть поля id , login и pas . Другие поля мы не будем использовать. Если они есть в таблице, то они будут оставаться пустыми.

Форма авторизации отправляет данные в файл registration.php. Расположим его в той же папке, где находится страница. Код скрипта будет такой:

В строке 9 мы устанавливаем возврат к странице с формами. Так как на локальном сервере выполнение скрипта и повторная загрузка страницы происходит очень быстро, то визуально это будет выглядеть так, как будто при нажатии кнопки «Зарегистрироваться», ничего не происходит. На реальных сайтах обычно делают переход на специальную страницу с информацией о том, что пользователь зарегистрирован и регисрационными данными. Попробуйте выполнить регистрацию и посмотрите, появляются ли в базе данных новые записи.

Авторизация

Форма авторизации запускает на сервере файл authorization.php. Этот скрипт принимает логин и прароль и проверяет, есть ли такой пользователь. Если есть, то логин будет записываться в сессию. Если такой пользователь не найден, то в сессию будет записываться информация об этом. Это нужно для того, чтобы страница, которая будет открыта после выполнения скрипта, получила эту информацию и вывела сообщение, что введён неправильный логин или пароль. Код скрипта такой:

В строке 7 формируется запрос на выборку строки с логином и паролем, полученными из формы. Перед полем pas написано ключевое слово BINARY. Оно нужно для того, чтобы при сравнении по этому полю учитывался регистр символов. Если нужно, чтобы регистр учитывался и при сравнении логина, то BINARY нужно написать перед ним. В примере делается запрос на выборку всех полей. На практике можно делать выборку только тех полей, данные из которых нужно будет выводить на страницу.

После получения результата, проверяется, найдена ли указанная запись. Если запись есть, то логин записывается в сессию. Если пользователь не найден, то вместо логина пишется строка «er login». Можно написать другой текст, но нужно быть уверенным, что он не совпадёт с каким-то логином. Затем происходит возврат на страницу с формами.

На страницах сайта должен быть код, в котором происходит проверка — есть ли в сессии логин. И в зависимости от этого определяется, как должна выглядеть страница. В нашем примере есть только одна страница. На ней и сделаем проверку. Только код будет разделён на две части. Открытие сессии должно производиться до вывода каких-либо данных, то есть, до HTML кода. Поэтому эта часть располагается в самом начале страницы. А остальной код находится внутри тэга , потому что он добавляет на страницу контнет. Добавим в начало страницы такую строку:

Остальной скрипт расположим в теге , в его начале:

Если в сессии есть логин, но в нём содержится строка «er login», то выводится сообщение, что логин или пароль неправильный. После вывода сообщения логин становится пустым. Это сделано для того, чтобы сообщение выводилось только один раз и при переходе на другие страницы не появлялось. Если логин другой, значит пользователь авторизован и страница формируется как для зарегистрированных. Если логина нет, значит авторизации ещё не было и страница выводится для не зарегистрированных пользователей.

Мы рассмотрели только общий принцип создания функции регистрации и авторизации. На реальных сайтах она сложнее. Формы должны выводиться только для не авторизованных пользователей. Кроме того, нужно добавить кнопку «Выход», которая отменяет авторизацию. При регистрации нужно делать проверку формы, проверять уникальность логина и добавить подтверждение пароля.

Коприрование материалов сайта возможно только с согласия администрации

Авторизация через базы данных

Учебник PHP

Практика

Важное

Регулярки

Работа с htaccess

Файлы, папки

Сессии и куки

Работа с БД

Практика по работе с БД в PHP

Перед чтением см. новые уроки раздела «Важное», которые появились выше.

Практика

Движок PHP

Продвинутые БД

Аутентификация

Практика

Введение в ООП

  • Урок №
    новая вкладка с new.code.mu
    Введение
  • Урок №
    новая вкладка с new.code.mu
    Свойства
  • Урок №
    новая вкладка с new.code.mu
    Методы
  • Урок №
    новая вкладка с new.code.mu
    Свойства и $this
  • Урок №
    новая вкладка с new.code.mu
    Методы и $this
  • Урок №
    новая вкладка с new.code.mu
    public private
  • Урок №
    новая вкладка с new.code.mu
    Конструктор
  • Урок №
    новая вкладка с new.code.mu
    Геттеры сеттеры
  • Урок №
    новая вкладка с new.code.mu
    Свойства только для чтения
  • Урок №
    новая вкладка с new.code.mu
    Один класс — один файл
  • Урок №
    новая вкладка с new.code.mu
    Объекты в массиве
  • Урок №
    новая вкладка с new.code.mu
    Начальные значения свойств в конструкторе
  • Урок №
    новая вкладка с new.code.mu
    Начальные значения свойств при объявлении
  • Урок №
    новая вкладка с new.code.mu
    Свойство из переменной
  • Урок №
    новая вкладка с new.code.mu
    Метод из переменной
  • Урок №
    новая вкладка с new.code.mu
    Метод сразу после создания
  • Урок №
    новая вкладка с new.code.mu
    Цепочки методов в классе
  • Урок №
    новая вкладка с new.code.mu
    Класс как набор методов
  • Урок №
    новая вкладка с new.code.mu
    Наследование классов
  • Урок №
    новая вкладка с new.code.mu
    Модификатор protected
  • Урок №
    новая вкладка с new.code.mu
    Перезапись методов родителя
  • Урок №
    новая вкладка с new.code.mu
    Перезапись конструктора родителя
  • Урок №
    новая вкладка с new.code.mu
    Передача по ссылке
    новая вкладка с new.code.mu
    . текст, код Клонирование объектов
  • Урок №
    новая вкладка с new.code.mu
    Использование объектов в другом классе
  • Урок №
    новая вкладка с new.code.mu
    Передача объектов параметрами
  • Урок №
    новая вкладка с new.code.mu
    Сравнение объектов
  • Урок №
    новая вкладка с new.code.mu
    Оператор instanceof
  • Урок №
    новая вкладка с new.code.mu
    Контроль типов
  • Урок №
    новая вкладка с new.code.mu
    Статические методы
  • Урок №
    новая вкладка с new.code.mu
    Статические свойства
  • Урок №
    новая вкладка с new.code.mu
    Объект со статическими свойствами и методами
  • Урок №
    новая вкладка с new.code.mu
    Константы класса
    новая вкладка с new.code.mu
    . текст, код Наследование и private
  • Урок №
    новая вкладка с new.code.mu
    . текст, код final
    новая вкладка с new.code.mu
    . в стек это Анонимные классы
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Полиморфизм

Абстрактные классы и интерфейсы

Трейты

ООП Магия

Практика

Практика: классы как набор методов

  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс ArrayConvertor
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс TagHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс FormHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс TableHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс SessionShell
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс CookieShell
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс FileManipulator
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс databaseShell TODO cart корзина flash шаблонизатор роутер контроллер кеш логи фалидатор

Продолжение еще следует

  • .
    по ООП еще много уроков будет, дописываю

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

Конечно, в большинстве случаев это не так — вашим сайтом будет пользоваться большое количество человек.

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

Как обычно, начнем с самого простого и будем постепенно усложнять.

Несколько пользователей, база данных

Для начала создайте с помощью PhpMyAdmin таблицу users в какой-нибудь тестовой базе данных.

Таблица users должна выглядеть так:

id login (Логин) password (Пароль)
1 user 12345
2 admin 54321

У нас есть два пользователя — user и admin и пароли к ним.

Следующий код реализует простую авторизацию на БД. Что в нем происходит?

Пользователь вводит логин и пароль в поле авторизации, эти данные приходят в скрипт, который делает SQL запрос в базу данных и на основании результата судит о том, авторизовать пользователя или нет:

Добавляем сессию

Что должно происходить, если пользователь ввел успешную пару логин-пароль?

Мы должны стартовать сессию и отметить в ней информацию о том, что пользователь авторизовался.

В принципе, можно на этом ограничится и ничего больше не писать в сессию.

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

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

Дополним наш код:

Полностью код авторизации примет такой вид:

Если мы теперь захотим вывести фразу ‘Привет, имя_пользователя’, то это будет сделать несложно:

Неправильная пара логин-пароль

В том, случае если пользователь ввел неправильно логин или пароль — не следует сообщать ему, что именно он ввел неправильно.

Следует написать такую фразу: ‘Неправильный логин или пароль!’ — что-то в таком роде.

Зачем это нужно?

Затем, что хакеру сложнее было подобрать пару логин-пароль с помощью перебора.

Если дать ему информацию о том, что логин верен, а пароль — нет, он сможет перебирать только пароли для данного логина, и его задача станет существенно проще.

Что вам делать дальше:

Приступайте к решению задач по следующей ссылке: задачи к уроку.

Когда все решите — переходите к изучению новой темы.

Работа с сессиями. Создание простой авторизации на PHP

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

Форма авторизации обычно состоит из двух текстовых полей (Логин и пароль) и кнопки Войти. Сейчас при создании в интернет-магазинах личного кабинета, набирает моду установка полей Телефон и Имя, или Имя и email, и другие комбинации. Но советуем так ни когда не делать, т.к. Имя можно написать по-разному, телефон тоже (84952322323 или 232-23-23).

PHP сессии

В этом уроке вы познакомитесь с правильной работой с сессиями на PHP.

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

Например, на странице https://ox2.ru/index.php мы записали в сессию ‘session_test’ значение ‘123’. На странице https://ox2.ru/shop.php мы можем прочитать сессию session_test, и получить значение 123.

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

Для записи в сессии существует переменная $_SESSION.

Например, простой пример:

Файл index.php будет запись в сессию:

Файл session.php будет чтение сессии:

Вот в этом простом примере показана работа с сессиями.

Создание авторизации на PHP

Сейчас мы создадим пример авторизации. Основную функцию будет выполнять класс AuthClass.

Вот код с пояснением:

Конечно это самый простой пример создание авторизации на php. Пароли и имена пользователей должны браться из базы данных, шифроваться в MD5, и т.д. Более сложные примеры создания авторизации будут в следующих статьях.

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

Комментарии (Написать комментарий)

Комментарий:
Большое спасибо

Комментарий:
Всё отлично работает, спасибо! Но такой вопрос:
private $_login = «demo»; //Устанавливаем логин

У меня никак не выходит вместо «demo» прицепить внешнюю переменную. Подскажите пожалуйста, как туда её передать? чтобы можно было авторизовывать не 1-го человека, а много пользователей сверив соответствующие данные не статически, а с переменной.

Комментарий:
При авторизации логин заносится в $_SESSION[‘чего то там’]. в данном случае — $_SESSION[«login»].
Это суперглобальный массив, который доступен на любой странице.
Можно взять имя содержимое нужного элемента на нужной вам странице.

Или можно посмотреть весь массив вот через такую функцию.
function Test_ShowArr($text) <
foreach($text as $key=>$val)
<
echo $key.»=>».$val.»
«;
>
>

Комментарий:
Сергей, для простого вывода используй конструкцию вида: getLogin(); ?>
Например,

Комментарий пользователя getLogin(); ?>

А вот для записи комментария в БД примерно так:
getLogin();
$result = mysql_query(«INSERT INTO . (. username) VALUES (. ‘$username’)»);
.
?>
Если понял что это — хорошо, нет — гугли работа с БД

Все для создания своего сайта

Сегодня рассмотрим вариант скрипта регистрации и авторизации на вашем сайте. Поскольку систему авторизации мы уже подробно разобрали. А посмотреть и тем более скачать уже готовые рабочие скрипты вы можете на этой странице. То сейчас мы подробно и досконально разберем систему регистрации на вашем сайте.

Для чего нужна регистрация на сайте?

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

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

Скрипт регистрации сделаем по технологии ajax. Пусть это вас не пугает. Зато скрипт работает быстрее и без перезагрузки страницы.

Вот пример формы ввода :

Вверху формы мы указали три файла jQuery расширение файлов: javascript. Также указали графический файл login.gif. При не работающем скрипте (кнопка еще не нажата) gif файл login.gif имеет атрибут display: none. То есть файл не виден на странице. Как только пользователь нажимает кнопку регистрация, файл login.gif меняет свой атрибут на видимый. Данная фишка нужна для того чтобы на момент включения скрипта графический файл уже будет загружен на странице и пользователь сразу увидит после нажатия кнопки, индикатор загрузки.

Мастер Йода рекомендует:  Какие шаблоны проектирования стоит знать каждому программисту — отвечают эксперты

А теперь расмотрим файл обработчик данных поступающих с формы регистрации:

Вверху обработчика мы сразу включаем сессию при помощи функции session_start(); Эта функция предназначена для передачи переменных капчи которые генерируются случайным образом. Проверочный код настроен на вывод двух или трех знаков. Хотя количество выводимых знаков вы можете менять сами вплоть до 12 знаков. Но чрезмерное увеличение знаков капчи может привести к тому что клиент не захочет проходить регистрацию. Где вы будете их прописывать чуть ниже.

Сам скрипт проверяет наличие переменной $_POST[`action`] который равен значению «save». Наличие этих данных говорит скрипту на запуск работы и пора проверять поступившие данные. Вначале проверяем логин на количество знаков их должно быть не больше двенадцати. Вы можете самостоятельно изменить это количество в строке 39 (Это вы можете увидеть если откроете файл в редакторе PSPaD).

Затем проверяем каким шрифтом указан логин. Если указаны кириллические символы выводим ошибку и останавливаем работу скрипта.

Затем проверяем пароль и повтор пароля. Если пароли не совпадают — останавливаем скрипт и выводим ошибку. Проверяем пароль на количество знаков. В начальном варианте настроено на минимальное количество 4 максимальное 16. Вы самостоятельно можете изменить настройки по количеству знаков в строке сорок семь.

Затем проверяем правильно ли указаны знаки который сгенерирован скриптом капча. Для этого сравниваем переменную $_POST[`keystring`] и переменную $_SESSION[`captcha_keystring`]. Эти два переменных должны быть равны иначе выводим ошибку и останавливаем скрипт. Чтобы при сравнении двух переменных не учиывать регистр знаков (большие или маленькие буквы) мы обрабатываем оба переменных при помощи функции strtolower. Эта функция переводит все значения, указанные рядом в скобках в нижний регистр. Проще говоря переводит все знаки из заглавных в маленькие буквы.

Как и обещал припишем количество выводимых знаков капчи. Это строка 9. Меняем цифры, например 6, 8. Тогда будет указано шесть или восемь знаков. Это выбираете вы сами лично. Кроме того можно задать ширину и высоту поля для отображения капчи. Все это прописываете в файле kcaptcha_config.php

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

Чуть выше стоят функции для проверки e-mail. Первая проверяеет правильно ли написан адрес e-mail. А вторая проверяеет наличие такого же адреса email в базе данных.

Если все указано верно то пишем все данные в базу данных. И выводим сообщение что все сделано верно. В нашем варианте выводим сообщение и ссылку на страницу авторизации.

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

А процесс верификации или активации состоит в том что на указанный при регистрации адрес email отправляется письмо со ссылкой внутри письма. Клиент который прошел регистрацию получает данное письмо открывает и проходит по ссылке. Ссылка обычно переводит статус в базе данных на активный. Данную функцию мы подробно рассмотрели и разобрали на этой странице.

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

Возможно вас заинтересуют другие статьи

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

Tronkhame 2020.12.01 00:30:32

Проверяйте, что заливаете. Уже второй скрипт регистрации скачиваю, не работают. В коде есть main.js , в файлах его нет и тп.

Administrator: Проверил что залил. Все прекрасно работает. Скорей всего ошибка где-то у вас. Возможно вы перепутали пути к файлам. Если вы поставили скрипт на свой сайт, то пропишите свои пути к файлам.
Например, в файле reg.php строка 6:
$sha=$sh.»scripts/pro/»;
Переменная $sh это ваш сайт, а /scripts/pro/ это папки где находятся файлы скрипта. Замените их на свои.

Файл main.js это проверочный код от сервиса касперского, о том что сайт не содержит вирусов. Он не играет никакой роли в работе скрипта
Свернуть обратно Проверяйте, что заливаете. Уже второй скрипт регистрации скачиваю, не работают. В коде есть main.js , в файлах его нет и тп.

Administrator: Проверил что Читать дальше.

Регистрация | Авторизация на сайте PHP и MySQLi

В этой теме хочу поговорить о том для чего нужна регистрация/авторизация на сайте, и как её написать самому на языке PHP и MySQLi.

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

Теперь давайте напишем простую регистрацию, где будет три поля: Логин, Электронная почта и пароль.
В БД выполняем запрос:

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

Чуть позже, я расскажу, как сделать проверку ввода пароля на правильность, как защититься от инъекции, как сделать проверку корректности почты и так далее.

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

В этой статье вы узнаете, как создать форму регистрации и авторизации, используя HTML, JavaScript, PHP и MySql. Такие формы используются почти на каждом сайте, в независимости от его типа. Они создаются и для форума, и для интернет-магазина и для социальных сетей (такие как например Facebook, Twiter, Odnoklassniki) и для многих других типов сайтов.

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

Создание таблицы в Базе Данных

Для того чтобы реализовать регистрацию пользователей, в первую очередь нам нужна База Данных. Если она у Вас уже есть, то замечательно, иначе, Вам нужно её создавать. В статье Создание базы данных mysql в phpmyadmin, я подробно объясняю, как сделать это.

И так, у нас есть База Данных (сокращённо БД), теперь нам нужно создать таблицу users в которой будем добавлять наших зарегистрированных пользователей.

Как создавать таблицу в БД, я также объяснил в статье Создание базы данных mysql в phpmyadmin. Перед тем как создать таблицу, нам необходимо определить какие поля она будет содержать. Эти поля будут соответствовать полям из формы регистрации.

Значит, подумали, представили какие поля будут у нашей формы и создаём таблицу users с такими полями:

Все поля типа “VARCHAR” должны иметь значение по умолчанию NULL.

Если Вы хотите чтобы Ваша форма регистрации имела ещё какие-то поля, то Вы можете их здесь также добавить.

Всё, наша таблица users готова. Переходим к следующему этапу.

Подключение к Базе Данных

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

В папке нашего сайта, создаём файл с именем dbconnect.php, и в нём пишем следующий скрипт:

Этот файл dbconnect.php нужно будет подключить к обработчикам форм.

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

Структура сайта

Теперь давайте разберёмся с HTML структурой нашего сайта.

Шапку и подвал сайта вынесем в отдельные файлы, header.php и footer.php. Их будем подключать на всех страницах. А именно на главной (файл index.php), на страницу с формой регистрации (файл form_register.php) и на страницу с формой авторизации (файл form_auth.php).

Блок с нашими ссылками, регистрация и авторизация, добавим в шапку сайта, чтобы они отображались на всех страницах. Одна ссылка будет ввести на страницу с формой регистрации (файл form_register.php) а другая на страницу с формой авторизации (файл form_auth.php).

Содержимое файла header.php:

Содержимое файла footer.php:

Подключение файлов header.php и footer.php будем делать с помощью функции require_once(«путь_к_файлу»).

И так, давайте подключим эти файлы к главному файлу нашего сайта index.php.

Для оформления вида страницы, в шапке (файл header.php) подключили файл стилей css/styles.css. Код данного файла сейчас нас не особо интересует, поэтому нет смысла его здесь показывать. Вы сможете увидеть его открыв этот файл css/styles.css, из архива с материалами данной статьи.

В итоге, главная страница, у нас выглядит так:

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

Форма регистрации

Теперь перейдём к форме регистрации. Как Вы уже поняли, она у нас находится в файле form_register.php.

Идём в Базу Данных (в phpMyAdmin), открываем структуру таблицы users и смотрим какие поля нам нужны. Значит, нам нужны поля для ввода имени и фамилии, поле для ввода почтового адреса(Email) и поле для ввода пароля. И ещё в целях безопасности добавим поле для ввода капчи.

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

Перед выводом формы добавляем блок для вывода сообщений об ошибках из сессии.

И ещё момент, если пользователь уже авторизован, и он ради интереса заходит на страницу регистрации напрямую, написав в адресную строку браузера адрес_сайта/form_register.php, то мы в этом случае вместо формы регистрации, выведем ему заголовок о том, что он уже зарегистрирован.

В общем, код файла form_register.php у нас получился таким:

В браузере, страница с формой регистрации выглядит так:

С помощью атрибута required, мы сделали все поля обязательными к заполнению.

Обратите внимание на код формы регистрации где выводится капча:

Мы в значение атрибута src для изображения, указали путь к файлу captcha.php, который генерирует данную капчу.

Посмотрим на код файла captcha.php:

Код хорошо закомментирован, поэтому я остановлюсь только на одном моменте.

Внутри функции imageTtfText(), указан путь к шрифту verdana.ttf. Так вот для корректной работы капчи, мы должны создать папку fonts, и поместить туда файл шрифта verdana.ttf. Его Вы можете найти и скачать из интернета, или взять из архива с материалами данной статьи.

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

Проверка email на валидность с помощью jQuery

Любая форма нуждается в проверки на валидность введённых данных, как на стороне клиента ( с помощью JavaScript, jQuery), так и на стороне сервера.

Особенную внимательность мы должны уделить полю Email. Очень важно чтобы введённый почтовый адрес был валидным.

Для данного поля input, мы задали тип email ( type=»email» ), это нас немножко предостерегает от неправильных форматов. Но, этого недостаточно, потому что через инспектор кода, которого предоставляет нам браузер, можно легко изменить значение атрибута type с email на text, и всё, наша проверка будет уже недействительна.

И в таком случае, мы должны сделать более надёжную проверку. Для этого, воспользуемся библиотекой jQuery от JavaScript.

Для подключения библиотеки jQuery, в файле header.php между тегами , перед закрывающего тега , добавляем эту строчку:

Сразу после этой строчки, добавим код проверки валидации email. Здесь же добавим код проверки длины введённого пароля. Его длина должна быть не меньше 6 символов.

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

И так, с проверкой формы на клиентской части мы закончили. Теперь мы можем отправить её на сервер, где также сделаем пару проверок и добавим данные в БД.

Регистрация пользователя

Форму мы отправляем на обработку файлу register.php, через метод POST. Название данного файла обработчика, указано в значение атрибута action. А метод отправки указано в значение атрибута method.


Открываем этот файл register.php и первое что нам нужно сделать, это написать функцию запуска сессии и подключить созданный нами ранее файл dbconnect.php (В этом файле мы сделали подключение к БД). И ещё, сразу объявим ячейки error_messages и success_messages в глобальном массиве сессии. В error_mesages будем записывать все сообщения об ошибках возникающие при обработке формы, а в succes_messages, будем записывать радостные сообщения.

Перед тем как продолжить, мы должны проверить, была ли вообще отправлена форма. Злоумышленник, может посмотреть на значение атрибута action из формы, и узнать какой файл занимается обработкой данной формы. И ему может прийти в голову мысль перейти напрямую в этот файл, набирая в адресной строке браузера такой адрес: https://арес_сайта/register.php

Поэтому нам нужно проверить наличие ячейки в глобальном массиве POST, имя которой соответствует имени нашей кнопки «Зарегистрироваться» из формы. Таким образом мы проверяем была ли нажата кнопка «Зарегистрироваться» или нет.

Если злоумышленник попытается перейти напрямую в этот файл, то он получить сообщение об ошибке. Напоминаю, что переменная $address_site содержит название сайта и оно было объявлено в файле dbconnect.php.

Далее, нам необходимо проверить введённую капчу. То есть сравнивать полученное значение от пользователя со значением которая есть в сессии.

Значение капчи в сессии было добавлено при её генерации, в файле captcha.php. Для напоминания покажу ещё раз этот кусок кода из файла captcha.php, где добавляется значение капчи в сессию:

Теперь приступим к самой проверке. В файле register.php, внутри блока if, где проверяем была ли нажата кнопка «Зарегистрироваться», а точнее где указан комментарий » // (1) Место для следующего куска кода» пишем:

Далее, нам нужно обрабатывать полученные данные, из массива POST. Первым делом, нам нужно проверить содержимое глобального массива POST, то есть находится ли там ячейки, имена которых соответствуют именам полей input из нашей формы.

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

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

Этот код вставляем в указанное место «// (2) Место для следующего куска кода«.

Особенную важность имеет поле email. Мы должны проверить формат полученного почтового адреса и его уникальность в БД. То есть не зарегистрирован ли уже какой-то пользователь с таким же почтовым адресом.

В указанном месте «// (3) Место кода для проверки формата почтового адреса и его уникальности» добавляем следующий код:

И так, мы закончили со всеми проверками, пора добавить пользователя в БД. В указанном месте » // (4) Место для кода добавления пользователя в БД » добавляем следующий код:

Если в запросе на добавления пользователя в БД произошла ошибка, мы добавляем сообщение об этой ошибке в сессию и возвращаем пользователя на страницу регистрации.

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

С регистрацией мы закончили. Двигаемся дальше.

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

Форма авторизации находится у нас в файле form_auth.php. Она имеет поля для ввода почтового адреса, пароля и капчи.

Скрипт для проверки формата почтового адреса и длины пароля находится в файле header.php, поэтому он будет действовать и на поля из этой формы.

Запуск сессии также происходит в файле header.php, поэтому в файле form_auth.php сессию запускать не нужно, потому что получим ошибку.

Код формы авторизации ( файл form_auth.php ):

В браузере, форма авторизации выглядит следующем образом:

Как я уже сказал, скрипт проверки формата почтового адреса и длины пароля здесь также действует. Поэтому если пользователь введёт неправильный почтовый адрес или короткий пароль, то он сразу же получить сообщение об ошибке. А кнопка войти станет не активной.

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

Авторизация пользователя

В значение атрибута action у форы авторизации указан файл auth.php, это значит, что форма будет обрабатываться именно в этом файле.

И так, открываем файл auth.php и пишем код для обработки формы авторизации. Первое что нужно сделать это запустить сессию и подключить файл dbconnect.php для соединения с БД.

Дальше нам нужно объявить ячейки для хранения сообщений в глобальном массиве $_SESSION.

Дальше нам нужно проверить была ли нажата кнопка отправки формы (кнопка войти). То есть проверяем не зашёл ли злоумышленник напрямую в файл auth.php.

Дальше, в указанное место «//(1) Место для следующего куска кода«, пишем код для проверки капчи.

Мастер Йода рекомендует:  12+ советов для собеседования в IT-компанию по телефону

Если пользователь ввёл проверочный код правильно, то идём дальше, иначе возвращаем его на страницу авторизации.

Проверка почтового адреса

Дальше, проверяем формат полученного почтового адреса. В указанное место «//(2) Место для обработки почтового адреса» пишем:

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

Проверка пароля

Следующее поле для обработки, это поле с паролем. В указанное место «//(3) Место для обработки пароля«, пишем:

Здесь мы с помощью функции md5() шифруем полученный пароль, так как в БД пароли у нас находятся именно в зашифрованном виде. Дополнительное секретное слово в шифровании, в нашем случае «top_secret» должна быть та которая использовалась и при регистрации пользователя.

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

Выход с сайта

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

После того как пользователь прошёл авторизацию успешно, необходимо убрать эти ссылки и вместо них вывести ссылку выхода с сайта. Эта ссылка будет ввести на файл logout.php, где мы и произведём выход.

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

Модифицированный кусок кода из файла header.php:

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

Код файла logout.php:

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

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

Все скрипты проверены и рабочие. Архив с файлами этого маленького сайта Вы можете скачать по этой ссылке.

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

При возникновении вопросов обращайтесь, также, если вы заметили, какую-то ошибку в статье прошу вас, сообщите, мне об этом.

Видео формат статьи

Если Вы что-то не поняли, то можете посмотреть видео формат статьи.

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

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

Создаем форму авторизации

Здравствуйте уважаемый посетитель!

Сегодня, после небольшого перерыва, снова вернемся к рассмотрению вопросов, связанных с формами HTML.

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

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

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

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

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

Поэтому в этой статье форма авторизации будет рассмотрена только в части создания ее HTML-элементов и проведения проверки на совпадение введенных в форму логина и пароля с ранее сохраненными в базе данных учетными записями.

При этом для упрощения создания обработчика формы формировать PHP-код будем поэтапно с учетом следующих его основных функциональных узлов:

  • Получение данных.
  • Извлечение хеш-строки из базы данных.
  • Формирование хеша пароля.
  • Проверка на совпадение хеша пароля с хеш-строкой из базы данных.

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

  • Формируем элементы формы авторизации
  • Получение данных
  • Извлечение хеш-строки из базы данных
  • Формирование хеша пароля
  • Проверка на совпадение хеша пароля с хеш-строкой из базы данных
  • Исходные файлы сайта

Формируем элементы формы авторизации

Основные элементы формы авторизации были созданы ранее на этапе верстки и оформлены в соответствии с дизайном сайта.

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

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

В итоге, после выполненных дополнений, HTML-код формы авторизации принял следующий вид.

Панель пользователя

Рис.1 HTML-код формы авторизации

Каких-либо дополнительных пояснений по данному фрагменту кода здесь не требуется. Так как все используемые HTML-элементы мы достаточно подробно рассматривали ранее при создании других форм. Например, при создании формы регистрации.

Можно лишь отметить, что здесь в атрибуте action (поз.3) определяющем обработчик, к которому обращаются данные формы при отправке их на сервер, указан файл «auth.php» (имя auth взято от начальных букв англ. слова authentication). Поэтому этот файл необходимо будет создать в корневом каталоге для размещения PHP-скрипта обработчика.

А кроме этого, для двух добавленных ссылок (поз.9,10), предназначенных для восстановления утерянных пользователями данных аккаунта, необходимо добавить в таблицу базы данных «url» две дополнительные записи.

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

Рис.2 Добавленные строки таблицы url для создания новых страниц

Что касается оформления дополнительных ссылок, то для блоков

В следующей таблицы показаны свойства для этих элементов, которые нужно добавить в файл «main.css» в общую таблицу стилей CSS.

margin : .375em 0 .375em 0.125em;

Рис.3 Свойства CSS для вновь добавленных элементов

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

Рис.4 Форма авторизации с дополнительными элементами

Получение данных

После того, как с формированием формы мы закончили, теперь перейдем к аутентификации пользователей по введенным логину и паролю.

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

//—-Получение введенных в форму данных логина и пароля————-

if ( isset ($_POST[ «auth-login» ])) $auth_login = $_POST[ «auth-login» ];

$auth_login = $_POST[ «auth-login» ];

$auth_login = check_symbol ($auth_login, «Логин» , «1» , «0» );

if ( isset ($_POST[ «auth-password» ])) $auth_password = $_POST[ «auth-password» ];

$auth_password = $_POST[ «auth-password» ];

$auth_password = check_symbol ($auth_password, «Пароль» , «1» , «0» );

echo nl2br ( «Введенный логин: » .$auth_login. «\n» . «Введенный пароль: » .$auth_password. «\n\n» );

Рис.5 PHP-код получения данных из формы авторизации

Здесь, как и в предыдущих случаях при обработке форм, данные извлекаются из ассоциативного массива $_POST[] в виде переменных: $auth_login — для значений логина (поз.5) и $auth_password — для пароля (поз.9).

При этом, значения переменных берутся из массива $_POST[] только в том случае, если переменные массива $_POST[ «auth-login» ] и $_POST[ «auth-password» ] существуют, и в них действительно были переданы данные. В противном случае им присваивается пустое значение (поз.7,11).

А далее, с помощью пользовательской универсальной функции с именем check_symbol () выполняется проверка полученных переменных $auth_login (поз.8) и $auth_password (поз.12) на наличие запрещенных символов. И в случае необходимости производятся соответствующие преобразования.

Более подробно с назначением пользовательской функции check_symbol () и описанием ее работы можно ознакомиться в разделе Получаем данные от элементов формы в PHP одной из статей, относящейся к созданию формы онлайн заказа.

В данном случае в параметрах функции кроме значений переменных $auth_login и $auth_password и соответствующих им наименований полей («Логин», «Пароль»), третьим параметром установлен флаг обязательного заполнения поля (значение «1»), а четвертым определено, что проверка на соответствие шаблону не производится (значение «0»).

Что касается последней строки с использованием функции echo nl2br() (поз.13), то она здесь включена временно. Это сделано для возможности контроля работы обработчика в части получения данных из формы. В нормальном режиме работы эту строку следует закомментировать.

Теперь, можно попробовать оправить заполненную форму авторизации и проверить, какие в итоге данные мы получим.

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

Где в качестве логина будет использована комбинация символов Audi387357 , пароля — Z5nC89 .

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

Рис.6 Отображение полученных данных в обработчике

Как видно, после оправки формы мы перешли на страницу, соответствующую файлу «auth.php» с размещенном в нем PHP-скрипом обработчика. Где мы видим, что полученные данные полностью соответствуют тем данным, которые были введены в поля формы.

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

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

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

Извлечение хеш-строки из базы данных

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

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

В нашем случае поиск строки необходимо выполнять в таблице «orders» исходя из полученного логина. Поэтому в параметрах функции следует указать следующие значения:

  • имя таблицы — «orders»;
  • имя поля, в котором будет происходить поиск — «client-login»;
  • значение поля — полученный логин в виде переменной $auth_login .

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

//—-Извлечение хеш-строки из базы данных по логину из формы—-

$data_bd = getLine ($table, $column, $value);

$password_hash = $data_bd[ «password-hash» ];

echo nl2br ( «Извлеченный из базы данных хеш пароля: » .$password_hash. «\n\n» );

Рис.7 Фрагмент кода для получения хеша пароля из базы данных

Здесь после вызова функции getLine() все данные найденной строки возвращаются в виде ассоциативного массива $data_bd (поз.6).

После чего переменной $password_hash присваивается значение одного из элементов массива с индексом, соответствующем полю «client-login» (поз.7).

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

Таким образом переменная $password_hash при нахождении в таблице базы данных строки с заданным логином получает значение хеша пароля учетной записи соответствующего пользователя.

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

Рис.8 Вывод хеш-строки, извлеченной из базы данных

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

Формирование хеша пароля

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

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

$password_hash = crypt ($client_password_1, ‘$2y$10$’ .$salt. ‘$’ );

Рис.9 PHP-код, ранее используемый при получении хеша пароля при регистрации

Здесь для вычисления хеша $password_hash использовалась функция crypt() (поз.3), одним из параметров которой являлась автоматически генерированная уникальная соль $salt . Которая в свою очередь была получена путем извлечения строки из хеша псевдослучайной последовательности длиной в 22 символа с помощью функций substr() , sha1() , mt_rand() (поз.2).

Более подробно о том, как получить хеш при помощи функции crypt() можно посмотреть в разделе Использование функции crypt() статьи, в которой рассматривались практические примеры использования в PHP криптографических хеш-функций.

Таким образом, теперь для получения хеша пароля, полученного из формы, мы должны сделать точно такое же преобразование, используя ту же самую функцию crypt() и ту же соль.

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

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

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

Ниже на рисунке показано разбивка на составные части хеш-строки пароля, который ранее был сохранен в базе данных при регистрации.

Рис.10 Составные части хеш-строки

С особенностями работы функции crypt() и условиями ее использования можно ознакомиться здесь.

Очевидно, что получить из такой хеш-строки нужную соль совсем несложно. Для этого достаточно использовать функцию substr() , с помощью которой можно извлечь нужное количество символов.

В данном случае нас интересуют первые 29 знаков, которые включают в себя соль со всеми остальными служебными символами. Поэтому в параметрах функции нужно указать следующие значения: «0» — начало отсчета, «29» — длина подстроки

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

В следующем фрагменте кода с учетом вышеизложенного показано сначала получение соли в виде переменной $full_salt (поз.3), а затем хеша пароля $password_hash , полученного из формы (поз.4).

//—-Формирование хеша пароля из формы——

$full_salt = substr ($password_hash, 0 , 29 );

$new_hash = crypt ($auth_password, $full_salt. ‘$’ );

echo nl2br ( «Полученная соль: » .$full_salt. «\n» . «Полученный хеш пароля из формы: » .$new_hash. «\n\n» );

Рис.11 Фрагмент кода для получения хеша полученного пароля

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

Рис.12 Вывод полученного хеша пароля из формы

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

Осталось только за малым — проверить хеш введенного в форму пароля и хеш-строку из базы данных на идентичность с помощью PHP.

Проверка на совпадение хеша пароля с хеш-строкой из базы данных

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

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

Мастер Йода рекомендует:  Криптовалюты, майнинг, цифровая экономика Беларусь становится IT-центром Восточной Европы

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

Ниже показан простейший вариант PHP-кода с выводом результата проверки на экран браузера.

//—-Проверка на совпадение хеша пароля из формы с хеш-строкой из базы данных—-

if (! empty ($password_hash) && $password_hash == $new_hash) <

echo «Логин и пароль введены верно» ;

echo «Неверные Логин и/или Пароль!» ;

Рис.13 Вариант PHP-кода с выводом результата проверки на экран браузера

После добавления этого кода снова отправим форму с заведомо правильно введенными логином и паролем (логин — Audi387357, пароль — Z5nC89).

Рис.14 Вариант проверки при правильно введенных в форму данных

Как видно при правильно введенных данных проверка прошла успешно.

А теперь, убедимся в обратном, введем неправильные данные, например, изменим значение пароля добавив к нему еще какой-нибудь символ, скажем букву «s». И проверим, выявит ли обработчик отправку формы с неверно введенными данными.

Рис.15 Вариант отправки неверных данных в форме

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

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

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

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

Исходные файлы сайта

Исходные файлы сайта с обновлениями, которые были сделаны в данной статье, можно скачать из прилагаемых дополнительных материалов:

  • Файлы каталога www
  • Таблицы базы данных MySQL

Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

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

Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

Как сделать регистрацию для своего сайта на PHP + MySQL?

Всем привет! У людей, которые начинают осваивать язык PHP, почти сразу возникает вопрос — «как сделать регистрацию на сайте?«. Иногда даже — «Как сделать правильно?«.

Логика данного процесса такова:

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

Это грубая схема работы регистрации/авторизации для сайта.

Конечно, для реализации какой либо регистрации необходим хостинг который поддерживает PHP, а так же MySql. Иначе вы просто не сможете сохранить данные о пользователе, соответственно и зарегистрироваться он не сможет.

Если подумать, то можно сделать все достаточно просто. Можно даже обойтись без базы данных (хотя я не рекомендую так делать), однако остается резонный вопрос — «А безопасно ли это будет работать.

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

Как обезопасить свой сайт

Для безопасности вашего сайта, важны несколько пунктов.

  • Проще всего делать сайт с единой точкой входа. Коротко об этом поговорим чуть ниже.
  • Экранировать все запросы. Сделать это можно в ручную или же с помощью подготовленных запросов.
  • Ограничивать данные которые может ввести пользователь

Единая точка входа

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

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

Подробнее разберем эту тему в другой статье, а пока давайте создадим фундамент нашего сайта.

В корне сайта нужно создать файл «.htaccess» и прописать в нем правила переадресации.

Этот файл даст хостингу понять, что мы включаем переадресацию на index.php всех запросов, кроме картинок, стилей css и js скриптов.

Экранизация запросов

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

  • Ручная проверка данных
  • С помощью подготовленных запросов

Под ручной проверкой подразумевается, что все данные будут проходить фильтр из блоков «if else«, а так же через специальные функции которые удаляют спец-символы.

Подготовленные запросы, делают все безопаснее и понятнее при чтении кода. Совершить SQL-инъекцию уже не получиться и проверять данные не обязательно, однако рекомендуется.

Давайте теперь сохраним этот файл. Так как будем его использовать дальше. Назовем его к примеру login.php и положим его в корень сайта.

Index.php, обработка запросов

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

Маршрутный файл мы написали. Давайте теперь подключим базу данных.

Для начала создадим базу

Обычно это делается через PhpMyAdmin. Создаем новую базу данных и назовем к примеру «reg».

После создания она появиться чуть ниже, нажмите на нее. Жмем «создать таблицу». Далее нужно указать какие поля будем использовать. К примеру у нас будет только 3 поля: id, login, password.

Id будет цифровым, два остальных текстовыми полями. На id нужно нажать на A_I (чтобы цифра сама увеличивалась). Собственно все, база для теста создана.

Подключение к MySql в PDO

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

Регистрация для сайта на PHP

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

Итоги

Мы сделали простейшую регистрацию с PDO или же подготовленными запросами. Сейчас нет проверок на существование пользователей, то есть можно создать несколько одинаковых логинов, что ни есть хорошо, конечно же, но для понимания принципов сойдет. Так же, перед каждым отдельным сообщением пришлось добавить » » что бы кодировка не путалась.

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

Вы наверное заметили что мы не сделали страницу выхода из аккаунта. Да, так и есть, попробуйте сделать ее сами. Оставлю только подсказку, сессию можно удалить с помощью функции
«session_destroy()», что будет означать что мы вышли из аккаунта.

Создание регистрации на сайте на PHP + MySQL

Здравствуйте! Сейчас мы попробуем реализовать самую простую регистрацию на сайте с помощью PHP + MySQL. Для этого на вашем компьютере должен быть установлен Apache. Принцип работы нашего скрипта изображен ниже.

1. Начнем с создания таблички users в базе. Она будет содержать данные пользователя (логин и пароль). Зайдем в phpmyadmin (если вы создаете базу на своем ПК https://localhost/phpmyadmin/). Создаем таблицу users, в ней будет 3 поля.

Я создаю ее в базе mysql, вы можете создавать в другой базе. Далее устанавливаем значения, как на рисунке:

Нажимаем «сохранить». Итак, таблица у нас есть.

2. Необходимо соединение с этой таблицей. Давайте создадим файл bd.php. Его содержание:

В моем случае это выглядит так:

Сохраняем bd.php.
Отлично! У нас есть таблица в базе, соединение к ней. Теперь можно приступать к созданию странички, на которой пользователи будут оставлять свои данные.

3. Создаем файл reg.php с содержанием (все комментарии внутри):

4. Создаем файл, который будет заносить данные в базу и сохранять пользователя. save_user.php(комментарии внутри):

5. Теперь наши пользователи могут регистрироваться! Далее необходимо сделать «дверь» для входа на сайт уже зарегистрированным пользователям. index.php (комментарии внутри) :

В файле index.php мы выведем ссылочку, которая будет открыта только для зарегистрированных пользователей. В этом и заключается вся суть скрипта — ограничить доступ к каким-либо данным.

6. Остался файл с проверкой введенного логина и пароля. testreg.php (комментарии внутри):

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

Все проверил, работает исправно!

Автор: Стороженко Евгений (отредактировал и опубликовал Максим Шкурупий)

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.ruseller.com
Автор: Максим Шкурупий
Урок создан: 24 Июля 2009
Просмотров: 10080105
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

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

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

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

Регистрация и авторизация пользователей

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

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

Для начала давайте оговорим все шаги, которые сделаем далее. Что нам вообще нужно? Нам нужен сценарий, который будет регистрировать пользователя, авторизовать пользователя, переадресовывать пользователя куда-либо после авторизации. Также нам нужно будет создать страницу, которая будет защищена от доступа неавторизованных пользователей. Для регистрации и авторизации нам необходимо будет создать HTML -формы. Информацию о зарегистрированных пользователях мы будем хранить в базе данных. Это значит, что нам еще нужен скрипт подключения к СУБД. Всю работу у нас будут выполнять функции, которые мы сами напишем. Эти функции мы сохраним в отдельный файл.

Итак, нам нужны следующие файлы:

  • соединение с СУБД;
  • пользовательские функции;
  • авторизация;
  • регистрация;
  • защищенная страница;
  • сценарий завершения работы пользователя;
  • сценарий, проверяющий статус авторизации пользователя;
  • таблица стилей для простейшего оформления наших страниц.

Всё это будет бессмысленно, если у вас нет соответствующей таблицы в базе данных. Запустите инструмент управления своим СУБД (PhpMyAdmin или командную строку, как удобнее) и выполните в нем следующий запрос:

Наши файлы со сценариями я назову так (все они будут лежать в одном каталоге):

  • database.php;
  • functions.php;
  • login.php;
  • registration.php;
  • index.php;
  • logout.php;
  • checkAuth.php;
  • style.css.

Назначение каждого из них, я уверен, вам понятно. Начнем со скрипта соединения с СУБД. Вы его уже видели. Просто сохраните код этого скрипта в файле с именем database.php . Пользовательские функции мы будем объявлять в файле functions.php . Как это всё будет работать? Неавторизованный пользователь пытается получить доступ к защищенному документу index.php , система проверяет авторизован ли пользователь, если пользователь не авторизован, он переадресовывается на страницу авторизации. На странице авторизации пользователь должен видеть форму авторизации. Давайте сделаем её.

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

Если всё сделано верно, у вас в броузере должно быть следующее:

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

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

Нам нужно, чтобы поля логина и пароля не были пустыми. Затем необходимо проверить логин на соответствие требованиям. Пароль также должен соответствовать описанным требованиям, а повторно указанный пароль должен с ним совпадать и, кроме того, они должны быть идентичны. Если какое-то из этих условий не выполняется, обработка данных формы должна быть прекращена, в массив сообщений об ошибке должно быть записано соответствующее оповещение, и оно должно быть отображено пользвателю. Для удобства пользователя мы сохраним введенный им логин (если он его указал), записав его значение в массив $fields .

Если всё нормально, в окне вашего броузера, обратившись к документу registration.php, вы должны увидеть примерно такую форму:

Теперь, допустим, пользователь нажал на кнопку регистрации, не заполнил поля формы. Согласно нашему алгоритму, логин и пароль не могут быть пустыми. Если это условие не выполняется, регистрация невозможно. Мы помним о том, что обработка данных формы происходит в текущем сценарии. Значит нам нужно изменить его код, добавив соответствующие проверки. Сразу же оговорим и следующие проверки. Если введены и логин, и пароль, нужно проверить их соответствие указанным требованиям. Для проверки логина и пароля мы создадим пользовательские функции в файле functions.php.

Теперь нам нужно изменить файл registration.php, чтобы задействовать объявленные нами функции. В сценарий мы добавим условие, проверяющее нажатие кнопки регистрации. Внутри этого условия запускается проверка логина и паролей. В случае, если какая-то из проверок завершается неудачей, мы вновь отображаем форму, и выводим сообщение об ошибке. Если ошибок нет, мы регистрируем пользователя, форму регистрации при этом уже не отображаем, сообщаем пользователю об успешной регистрации, и с помощью функции header() переадресовываем его к форме авторизации.

В скрипте вы должны были заметить еще одну новую функцию — registration() . А мы её еще не объявляли. Давайте сделаем это.

Если всё нормально, ваш пользователь будет зарегистрирован. Можете потестировать форму. Попробуйте зарегистрировать пользователей с одинаковыми логинами. После успешной регистрации пользователь будет перееадресован к форме авторизации. Ранее мы просто создали разметку для отображения этой формы. Так как в её атрибуте action не указан никакой параметр, данные, отправленные формой, будут обрабатываться в этом же сценарии. Значит нам нужно написать код для обработки, и добавить его в документ login.php.

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

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

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

А теперь давайте создадим код нашей защищенной страницы. Он будет довольно-таки прост.

Как видите, в защищенном документе мы подключаем только один файл — checkAuth.php. Все остальные файлы подключаются уже в других сценариях. Поэтому наш код не выглядит громоздким. Регистрацию и авторизацию пользователей мы организовали. Теперь необходимо позволить пользователям выходить из системы. Для этого мы создадим сценарий в файле logout.php.

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

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