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

Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

*Наведите курсор мыши для приостановки прокрутки.

Назад Вперед

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

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

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

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



Вот как наша супер простая система будет работать:

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

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

Преимущества такого подхода:

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

Недостатки:

Безопасность аккаунта пользователя. Если кто-то имеет доступ к почте пользователя, он может авторизоваться.
- Email не защищён и может быть перехвачен. Имейте в виду, что этот вопрос актуален и в случае, когда пароль был забыт и его необходимо восстановить, или в любой системе авторизации, которая не использует HTTPS для передачи данных (логин/пароль);
- Пока вы настроите как нужно почтовый сервер, существует шанс, что сообщения со ссылками на авторизацию будут попадать в спам;

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

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

Как пользоваться этой системой

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

Вам нужно скачать исходники, приложенные к уроку
- В архиве найти файл tables.sql Импортируйте его в вашу базу данных используя опцию импорта в phpMyAdmin. Альтернативный способ: открыть этот файл через текстовый редактор, скопировать SQL запрос и выполнить его;
- Открыть includes/main.php и заполнить настройки связи с вашей базой данных (указать пользователя и пароль для связи с базой а также хост и имя базы). В этом же файле, вы также должны указать email, который будет использован в качестве оригинального адреса для сообщений отправляемых системой. Некоторые хосты блокируют исходящие мейлы пока в форме не будет указан настоящий email адрес, который был создан из панели управления хостом, так что укажите реальный адрес;
- Загрузите все файлы index.php , protected.php и папки assets и includes через FTP на ваш хост;
- Добавьте код ниже на каждую PHP-страницу, где нужно отобразить форму авторизации;

Require_once "includes/main.php"; $user = new User(); if(!$user->loggedIn()){ redirect("index.php"); }
- Готово!

Для тех же, кому интересно, как это всё работает - вперёд к чтению ниже!

Первый шаг - написание HTM- кода формы авторизации. Данный код располагается в файле index.php . Этот файл также содержит PHP-код, обрабатывающий данные формы и другие полезные функции системы авторизации. Узнать об этом больше можно в разделе ниже, посвящённом обзору PHP кода.

index.php

Tutorial: Super Simple Registration System With PHP & MySQL

Login or Register

Enter your email address above and we will send
you a login link.

В головной секции (между тегами и ) я подключил основные стили (в этом уроке они не разбираются, поэтому вы можете посмотреть их сами. Папка assets/css/style.css). До закрывающего тега я подключил библиотеку jQuery и файл script.js, который мы напишем и разберём чуть ниже.


JavaScript

jQuery отслеживает состояние кнопки "Зарегистрироваться/авторизоваться" с помощью функции e.preventDefault() и отправляет AJAX-запросы. В зависимости от ответа сервера, выводит то или иное сообщение и определяет дальнейшие действия/

assets/js/script.js

$(function(){ var form = $("#login-register"); form.on("submit", function(e){ if(form.is(".loading, .loggedIn")){ return false; } var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, {email: email}, function(m){ if(m.error){ form.addClass("error"); messageHolder.text(m.message); } else{ form.removeClass("error").addClass("loggedIn"); messageHolder.text(m.message); } }); }); $(document).ajaxStart(function(){ form.addClass("loading"); }); $(document).ajaxComplete(function(){ form.removeClass("loading"); }); });

был добавлен в форму для отображения текущего состояния AJAX-запроса (это стало возможным благодаря методам ajaxStart() ) и ajaxComplete() , которые вы сможете найти ближе к концу файла).

Этот класс показывает крутящийся анимированный gif-файл (как бы намекающий нам на то, что запрос обрабатывается), и также выступает как флаг, предотвращающий повторную отправку формы (когда кнопка зарегистрироваться была уже однажды нажата). Класс .loggedIn - это другой флаг, - устанавливается тогда, когда был отправлен email. Этот флаг моментально блокирует любые дальнейшие действия с формой.

Схема базы данных

Наша невероятно простая система регистрации использует 2 MySQL таблицы (SQL-код находится в файле tables.sql ). Первая хранит данные об аккаунтах пользователей. Вторая хранит информацию о количестве попыток входа.


Схема таблицы пользователей.

Система не использует паролей, что видно на схеме. На ней же можно увидеть колонку token с токенами, соседствующую с колонкой token_validity . Токен устанавливается как только пользователь подключается к системе, задаёт свой email для отправки сообщения (чуть подробнее об этом в следующем блоке). Колонка token_validity устанавливает время на 10 минут позже, после которого токен перестаёт быть актуальным.


Схема таблицы, считающая количество попыток авторизации.

В обоих таблицах IP-адрес хранится в обработанном виде, с помощью функции ip2long в поле типа integer.

Теперь мы можем написать немножко PHP-кода. Основной функционал системы возложен на класс User.class.php , который вы можете видеть ниже.

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

User.class.php

Class User{ // Частный ORM случай private $orm; /** * Найти пользователя по токену. Только валидные токены, приняты к рассмотрению. Токен генерируется только на 10 минут с того момента как был создан * @param string $token. Это искомый токен * @return User. Вернуть значение функции User */ public static function findByToken($token){ // найти токен в базе и убедиться, что установлен корректный временной штамп $result = ORM::for_table("reg_users") ->where("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result){ return false; } return new User($result); } /** * Авторизовать или зарегистрировать пользователя * @param string $email. Пользовательский email-адрес * @return User */ public static function loginOrRegister($email){ // Если такой пользователь уже существует, вернуть значение функции User от заданного email-адреса хранимого в базе if(User::exists($email)){ return new User($email); } // В противном случае создать нового пользователя в базе и вернуть значение функции User::create от указанного email return User::create($email); } /** * Создать нового пользователя и сохранить в базу * @param string $email. Пользовательский email-адрес * @return User */ private static function create($email){ // Записать нового пользователя и вернуть результат функции User от этих значений $result = ORM::for_table("reg_users")->create(); $result->email = $email; $result->save(); return new User($result); } /** * Проверить, существует ли такой пользователь в базе и вернуть булево значение переменной * @param string $email. Пользовательский email-адрес * @return boolean */ public static function exists($email){ // Существует ли пользователь в базе? $result = ORM::for_table("reg_users") ->where("email", $email) ->count(); return $result == 1; } /** * Создать новый пользовательский объект * @param экземпляр $param ORM , id, email or 0 * @return User */ public function __construct($param = null){ if($param instanceof ORM){ // ORM проверка пройдена $this->orm = $param; } else if(is_string($param)){ // Проверка на email пройдена $this->orm = ORM::for_table("reg_users") ->where("email", $param) ->find_one(); } else{ $id = 0; if(is_numeric($param)){ // идентификатору пользователя передаётся значение переменной $param $id = $param; } else if(isset($_SESSION["loginid"])){ // В противном случае смотри сессию $id = $_SESSION["loginid"]; } $this->orm = ORM::for_table("reg_users") ->where("id", $id) ->find_one(); } } /** * Сгенерировать новый SHA1 токен авторизации, записывает в базу и возвращает его значение * @return string */ public function generateToken(){ // Сгенерировать токен для авторизованного пользователя и сохранить его в базу $token = sha1($this->email.time().rand(0, 1000000)); // Сохранить токен в базе // И пометить его, что он актуален только в течение 10 следующих минут $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); return $token; } /** * Авторизовать пользователя * @return void */ public function login(){ // Отметить пользователя, как авторизованного $_SESSION["loginid"] = $this->orm->id; // Обновить значение поля базы last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); } /** * Уничтожить сессию и разлогинить пользователя * @return void */ public function logout(){ $_SESSION = array(); unset($_SESSION); } /** * Проверка, заходил ли пользователь * @return boolean */ public function loggedIn(){ return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; } /** * Проверка является ли пользователь администратором * @return boolean */ public function isAdmin(){ return $this->rank() == "administrator"; } /** * Найти тип пользователя, может быть либо administrator либо regular * @return string */ public function rank(){ if($this->orm->rank == 1){ return "administrator"; } return "regular"; } /** * Метод позволяющий получить приватную информацию пользователя в *качестве свойств объекта User * @param string $key Имя свойства, получающего доступ * @return mixed */ public function __get($key){ if(isset($this->orm->$key)){ return $this->orm->$key; } return null; } }

Токены генерируются с помощью SHA1 алгоритма и сохраняются в базе данных. Я использую функции времени MySQL, дабы задать 10-минутное ограничение актуальности токена.

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

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

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


Защищённая страница

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

functions.php

Function send_email($from, $to, $subject, $message){ // Хелпер, отправляющий email $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type: text/plain; charset=utf-8" . "\r\n"; $headers .= "From: ".$from . "\r\n"; return mail($to, $subject, $message, $headers); } function get_page_url(){ // Определить URL PHP-файла $url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://".$_SERVER["SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != ""){ $url.= $_SERVER["REQUEST_URI"]; } else{ $url.= $_SERVER["PATH_INFO"]; } return $url; } function rate_limit($ip, $limit_hour = 20, $limit_10_min = 10){ // Количество попыток входа за последний час по этому IP-адресу $count_hour = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00")") ->count(); // Количество попыток входа за последние 10 минут по этому IP-адресу $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min){ throw new Exception("Too many login attempts!"); } } function rate_limit_tick($ip, $email){ // Создать новую запись в таблице, считающей количество попыток входа $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip)); $login_attempt->save(); } function redirect($url){ header("Location: $url"); exit; }

Функции rate_limit и rate_limit_tick следят за количеством попыток авторизации за истёкший период времени с момента первой попытки. Попытка входа записывается в базе в столбец reg_login_attempt. Эти функции вызываются когда происходит обработка и отправка данных формы как вы можете видеть из следующего фрагмента кода.

Код ниже взят из файла index.php и он обрабатывает отправку формы. Он возвращает JSON-ответ, который, в свою очередь, обрабатывается jQuery в файле assets/js/script.js , который мы уже разбирали ранее.

index.php

Try{ if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"])){ // Output a JSON header header("Content-type: application/json"); // Является ли этот email-адрес валидным if(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)){ throw new Exception("Please enter a valid email."); } // Проверка. Позволено ли пользователю авторизоваться, не превысил ли он количество допустимых подключений? (файл functions.php для большей информации) rate_limit($_SERVER["REMOTE_ADDR"]); // Записать эту попытку авторизации rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["email"]); // Отправить письмо пользователю $message = ""; $email = $_POST["email"]; $subject = "Your Login Link"; if(!User::exists($email)){ $subject = "Thank You For Registering!"; $message = "Thank you for registering at our site!\n\n"; } // Попытка авторизовать или зарегистрировать пользователя $user = User::loginOrRegister($_POST["email"]); $message.= "You can login from this URL:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "The link is going expire automatically after 10 minutes."; $result = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result){ throw new Exception("There was an error sending your email. Please try again."); } die(json_encode(array("message" => "Thank you! We\"ve sent a link to your inbox. Check your spam folder as well."))); } } catch(Exception $e){ die(json_encode(array("error"=>1, "message" => $e->getMessage()))); }

После успешной авторизации/регистрации код выше отправит пользователю ссылку для авторизации. Токен становится доступным, т.к. он передаётся в качестве переменной в генерируемой ссылке методом $_GET с маркером tkn

index.php

If(isset($_GET["tkn"])){ // Является ли этот токен валидным для авторизации? $user = User::findByToken($_GET["tkn"]); if($user){ // Да, является. Осуществить редирект на защищённую страницу $user->login(); redirect("protected.php"); } // Нет, токен не валидный. Осуществить редирект, на страницу с формой авторизации/регистрации redirect("index.php"); }

$user->login()

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

Похожим образом устроена и обработка функции на выход из системы.

index.php

If(isset($_GET["logout"])){ $user = new User(); if($user->loggedIn()){ $user->logout(); } redirect("index.php"); }

В конце кода, я снова поставил редирект на index.php, таким образом параметр ?logout=1 передаваемый посредством URL не требуется.

Наш файл index.php требует доп. защиты - мы не хотим, чтобы люди, которые когда-либо однажды авторизовались в системе опять видели форму регистрации. Для этих целей, мы используем метод $user->loggedIn() .

index.php

$user = new User(); if($user->loggedIn()){ redirect("protected.php"); }

Наконец-то, вот кусок кода, позволяющий защитить страницы вашего сайта и сделать её доступной только после авторизации.

protected.php

// Чтобы защитить каждую страницу на вашем сайте подключите к ней файл // main.php и создайте новый объект User. Вот как это просто! require_once "includes/main.php"; $user = new User(); if(!$user->loggedIn()){ redirect("index.php"); }

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

Echo "Your email: ".$user->email; echo "Your rank: ".$user->rank();

Метод rank() используется здесь потому что в базе обычно хранятся номера (0 для обычного пользователя, 1 для администратора) и нам нужно преобразовать эти данные в статусы, к которым они относятся, в чём нам и помогает этот метод.

Чтобы сделать из обычного пользователя администратора, просто отредактируйте пользовательскую запись через phpMyAdmin (или любую другую программу, позволяющую управлять базами данных). Статус администратора не даёт каких-либо привилегий, в данном примере на странице будет выведено, что вы администратор - и всё.

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

Мы закончили!

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

Материал подготовил Денис Малышок специально для сайта сайт

P.S. Хотите двигаться дальше в освоении PHP и ООП? Обратите внимание на премиум-уроки по различным аспектам сайтостроения, включая программирование на PHP, а также на бесплатный курс по созданию своей CMS-системы на PHP с нуля с использованием ООП:

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!


Сегодня справочно-информационный сайт gosuslugi.ru на слуху почти у каждого жителя России. А вопрос «Как зарегистрироваться в госуслугах для получения загранпаспорта?» звучит повсеместно. И действительно, с помощью портала «Госуслуги» можно получить ту или иною государственную услугу в режиме онлайн, не простаивая очередей и не тратя времени и нервов на сбор документов. Подать заявление на выдачу заграничного паспорта или обмен гражданского, записаться на прием к врачу, узнать о наличии штрафов в ГИБДД, погасить задолженность перед налоговой службой и даже оплатить услуги ЖКХ – сегодня все это можно сделать прямо не выходя из дома. А теперь, когда уже обновленная версия заменила старый интерфейс, стоит разобраться, как зарегистрироваться на сайте госуслуг. Пошаговая инструкция поможет сделать это быстро и просто. Ну, а как зарегистрироваться в госуслугах для получения загранпаспорта рассмотрим отдельным пунктом, тем более, что в новой версии сайта, сделать это еще проще.

Что необходимо для регистрации на сайте «Госуслуги»

Пользователю, желающему иметь регистрацию на портале госуслуг, следует подготовиться заранее. Понадобятся:

  • Паспорт РФ;
  • СНИЛС;
  • Номер телефона – куда будут приходить уведомления, а также он понадобиться для восстановления пароля, если по какой-то причине пользователь его забудет или потеряет;
  • Адрес электронной почты – на нее также будут приходить уведомления.

Уровни учетных записей

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

  • Упрощенная регистрация. Позволяет воспользоваться преимущественно справочно-информационными услугами и ограниченным списком услуг, для которых не требуется подтверждение личности.
  • Стандартная учетная запись. Обеспечивает доступ к таким услугам, как «Запись на прием к врачу» или «Регистрация автомобиля».
  • Подтвержденная регистрация. Предоставляет доступ ко всем значимым услугам портала gosuslugi.ru.

Как зарегистрироваться на сайте госуслуг? Пошаговая инструкция (для новой версии)

Итак, полная регистрация на обновленном сайте госуслуг включает в себя всего 3 этапа.

Шаг 1. Упрощенная регистрация

Выполнение всех действий займет лишь несколько минут:

  1. Необходимо зайти на сайт gosuslugi.ru и в правой части окна выбрать поле «Зарегистрироваться».

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

  1. Корректно заполнить поля анкеты: фамилию, имя, указать номер мобильного телефона, а также адрес электронной почты, после чего нажать «Зарегистрироваться».

  1. Дождаться получения SMS-сообщения с кодом подтверждения на уже указанный номер телефона, ввести полученный код в соответствующее поле и нажать «Продолжить».

  1. Придумать на свое усмотрение и ввести пароль, подтвердить его повторным вводом и нажать «Готово»

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

Готово! Упрощенная регистрация успешно завершена.

Шаг 2. Получение стандартной учетной записи

Расширить свои возможности на сайте «Госуслуг» можно, заполнив форму «Мои данные / Основная информация»:


Важно! При заполнении личных данных понадобятся реквизиты СНИЛС и паспорта гражданина РФ.

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

Ожидание результата проверки займет не более 15 минут, по ее окончании на указанный в анкете номер телефона придет SMS-сообщение об успешном завершении.

Шаг 3. Подтверждение личности

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

Сделать это можно будет несколькими способами:


  • При личном обращении в специализированный центр обслуживания – это может быть офис компании «Ростелеком» или ближайшее почтовое отделение.

Важно! При себе необходимо иметь паспорт и СНИЛС. А ближайший центр обслуживания можно найти нажав «Найти центр обслуживания». После проверки документов, вам будет выдан конверт с кодом активации, который позднее необходимо будет зарегистрировать на портале госуслуг.

  • Заказным письмом почтой России.

Как правило, это заказное письмо (с кодом активации), поэтому для его получения в почтовом отделении необходимо будет предъявить извещение и удостоверяющий личность документ;

  • Электронной подписью или УЭК.

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

Получение кода активации и его регистрация

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

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

Как зарегистрироваться в госуслугах для получения загранпаспорта

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

Важно! Оформить загранпаспорт через госуслуги можно только если статус у учетной записи – подтвержденный.

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

  • Паспорт гражданина РФ;
  • Трудовую книжку;
  • Заграничный паспорт (с истекшим сроком действия, если такой имеется);
  • Свидетельство о рождении детей.

Порядок действий при оформлении загранпаспорта на сайте госуслуги:

  1. Для начала необходимо войти в Личный кабинет портала gosuslugi.ru, введя номер мобильного телефона или адрес электронной почты и пароль.
  2. Выбрать вкладку «Каталог госуслуг» и в разделе «Паспорта, регистрации, визы» нажать на ссылку Заграничный паспорт.


  1. Выбрать тип паспорта:

— новый биометрический, с большей степенью защиты и сроком на 10 лет;

— или старый бумажный, сроком на 5 лет.

Сумма госпошлины будет зависеть от типа паспорта.


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

После заполнения всех полей нажать «Отправить».

Важно! Некоторые поля анкеты заполняются автоматически. Это происходит в том случае, если информация по отдельным документам была внесена ранее в форму «Мои данные / Основная информация».

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

Начнем с добавления полей в таблицу « users » . Нам нужно поле для хранения e-mail адреса, поле для состояния пользователя (0 - неактивирован, 1 - активирован) и поле с датой регистрации.





Затем нужно подправить save_user.php , добавив проверку на корректность e-mail адреса и отправку письма для подтверждения регистрации. В письме находится ссылка с двумя переменными, передающимися методом get: логин и сгенерированный, уникальный для каждого пользователя, код. Код нам нужен, чтобы пользователь не смог активировать свой аккаунт без письма, а это даст нам уверенность, что введенный адрес почты, действительно, принадлежит ему. Добавим следующий код, после извлечения из глобальных переменных отправленных данных:

If (isset($_POST["email"])) { $email = $_POST["email"]; if ($email == "") { unset($email);} }
if (empty($login) or empty($password)or empty($code) or empty($email))
//добавим переменную с e - mail адресом
//если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
{
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); //останавливаем выполнение сценариев
}
if (!preg_match("/[email protected]+\.{2,3}/i", $email)) //проверка е-mail адреса регулярными выражениями на корректность
{exit ("Неверно введен е-mail!");}

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

// если такого нет, то сохраняем данные
$result2 = mysql_query ("INSERT INTO users (login,password,avatar,email,date) VALUES("$login","$password","$avatar","$email",NOW())");
// Проверяем, есть ли ошибки
if ($result2=="TRUE")
{
$result3 = mysql_query ("SELECT id FROM users WHERE login="$login"",$db);//извлекаем идентификатор пользователя. Благодаря ему у нас и будет уникальный код активации, ведь двух одинаковых идентификаторов быть не может.
$myrow3 = mysql_fetch_array($result3);
$activation = md5($myrow3["id"]).md5($login);// код активации аккаунта . Зашифруем через функцию md5 идентификатор и логин. Такое сочетание пользователь вряд ли сможет подобрать вручную через адресную строку.
$subject = "Подтверждение регистрации";//тема сообщения
$message = "Здравствуйте! Спасибо за регистрацию на citename.ru\nВаш логин: ".$login."\n
Перейдите по ссылке, чтобы активировать ваш аккаунт:\nhttp://localhost/test3/activation.php?login=".$login."&code=".$activation."\nС уважением,\n
Администрация citename.ru";//содержание сообщение
mail($email, $subject, $message, "Content-type:text/plane; Charset=windows-1251\r\n");//отправляем сообщение

Echo "Вам на E-mail выслано письмо с cсылкой, для подтверждения регистрации. Внимание! Ссылка действительна 1 час. Главная страница"; //говорим о отправленном письме пользователю
}

Сообщение отправлено! Теперь пользователь откроет его и перейдет по указанной ссылке на страницу, которая будет проверять код активации. Убедившись, что код верный, мы подтверждаем регистрацию, меняя в базе значение поля activation с «0» на «1».

Создаем файл activation.php

include ("bd.php");// файл bd . php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
$result4 = mysql_query ("SELECT avatar FROM users WHERE activation="0" AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 3600");//извлекаем аватарки тех пользователей, которые в течении часа не активировали свой аккаунт. Следовательно их надо удалить из базы, а так же и файлы их аватарок
if (mysql_num_rows($result4) > 0) {
$myrow4 = mysql_fetch_array($result4);
do
{
//удаляем аватары в цикле, если они не стандартные
if ($myrow4["avatar"] == "avatars/net-avatara.jpg") {$a = "Ничего не делать";}
else {
unlink ($myrow4["avatar"]);//удаляем файл
}
}
while($myrow4 = mysql_fetch_array($result4));
}
mysql_query ("DELETE FROM users WHERE activation="0" AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 3600");//удаляем пользователей из базы
if (isset($_GET["code"])) {$code =$_GET["code"]; } //код подтверждения
else
{ exit("Вы зашли на страницу без кода подтверждения!");} //если не указали code , то выдаем ошибку
if (isset($_GET["login"])) {$login=$_GET["login"]; } //логин,который нужно активировать
else
{ exit("Вы зашли на страницу без логина!");} //если не указали логин, то выдаем ошибку
$result = mysql_query("SELECT id FROM users WHERE login="$login"",$db); //извлекаем идентификатор пользователя с данным логином
$activation = md5($myrow["id"]).md5($login);//создаем такой же код подтверждения
if ($activation == $code) {//сравниваем полученный из url и сгенерированный код
mysql_query("UPDATE users SET activation="1" WHERE login="$login"",$db);//если равны, то активируем пользователя
echo "Ваш Е-мейл подтвержден! Теперь вы можете зайти на сайт под своим логином! Главная страница";
}
else {echo "Ошибка! Ваш Е-мейл не подтвержден! Главная страница";
//если же полученный из url и сгенерированный код не равны, то выдаем ошибку
}
?>

E-mail адрес подтвержден, теперь мы знаем, что этот адрес принадлежит данному пользователю, на него можно будет послать пароль, если пользователь его забудет, или другие уведомления. Но в чем различие активированных пользователей, от неактивированных? И те и другие могут зайти на сайт, следовательно, нам нужно ограничить в доступе неактивированных. Откроем файл testreg . php и допишем еще одно условие в запросе к базе:

$result = mysql_query("SELECT * FROM users WHERE login="$login" AND password="$password" AND activation="1"",$db); //извлекаем из базы все данные о пользователе с введенным логином
//мы дописали « AND activation ="1"», то есть пользователь будет искаться только среди активированных. Желательно добавить это условие к другим подобным проверкам данных пользователя

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

Автоматический вход.






Зарегистрироваться


Забыли пароль?

Ссылка есть, а файла нет. Давайте же напишем send _ pass . php . В нем мы спросим у пользователя логин и адрес почты. Если введенный e-mail и логин есть в базе, то отправим на него новый пароль, если пользователь забыл старый, ведь мы убедились при регистрации, что адрес почты действителен.

if (isset($_POST["login"])) { $login = $_POST["login"]; if ($login == "") { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
if (isset($_POST["email"])) { $email = $_POST["email"]; if ($email == "") { unset($email);} } //заносим введенный пользователем e-mail, если он пустой, то уничтожаем переменную
if (isset($login) and isset($email)) {//если существуют необходимые переменные

Include ("bd.php");

$result = mysql_query("SELECT id FROM users WHERE login="$login" AND email="$email" AND activation="1"",$db);// такой ли у пользователя е - мейл
$myrow = mysql_fetch_array($result);
if (empty($myrow["id"]) or $myrow["id"]=="") {
//если активированного пользователя с таким логином и е-mail адресом нет
exit ("Пользователя с таким e-mail адресом не обнаружено ни в одной базе ЦРУ:) Главная страница");
}
//если пользователь с таким логином и е-мейлом найден, то необходимо сгенерировать для него случайный пароль, обновить его в базе и отправить на е-мейл
$datenow = date("YmdHis");//извлекаем дату
$new_password = md5($datenow);// шифруем дату
$new_password = substr($new_password, 2, 6); //извлекаем из шифра 6 символов начиная со второго. Это и будет наш случайный пароль. Далее запишем его в базу, зашифровав точно так же, как и обычно.

$new_password_sh = strrev(md5($new_password))."b3p6f";// зашифровали
mysql_query("UPDATE users SET password="$new_password_sh" WHERE login="$login"",$db);// обновили в базе
//формируем сообщение

$message = "Здравствуйте, ".$login."! Мы сгененриоровали для Вас пароль, теперь Вы сможете войти на сайт citename.ru, используя его. После входа желательно его сменить. Пароль:\n".$new_password;//текст сообщения
mail($email, "Восстановление пароля", $message, "Content-type:text/plane; Charset=windows-1251\r\n");// отправляем сообщение

Echo " На Ваш e-mail отправлено письмо с паролем. Вы будете перемещены через 5 сек. Если не хотите ждать, то нажмите сюда.";//перенаправляем пользователя
}
else {//если данные еще не введены
echo "


Забыли пароль?


Забыли пароль?



Введите Ваш логин:



Введите Ваш E-mail:






";
}
?>

Далее мы сделаем автоматический вход. Работать он будет так: при удачном входе с нажатым чекбоксом в cookie будет вписываться auto = “yes”. Если сервер увидит, что в браузере auto = “yes”, то запустит сессию, а переменные возьмет там же, в cookie. Затем идет проверка запущенных сессий по базе.

Откроем testreg . php и допишем после удачного входа код:

If (isset($_POST["save"])){
//Если пользователь хочет, чтобы его данные сохранились для последующего входа, то сохраняем в куках его браузера

setcookie("id", $myrow["id"], time()+9999999);}
if (isset($_POST["autovhod"])){
//Если пользователь хочет входить на сайт автоматически
setcookie("auto", "yes", time()+9999999);
setcookie("login", $_POST["login"], time()+9999999);
setcookie("password", $_POST["password"], time()+9999999);
setcookie("id", $myrow["id"], time()+9999999);}

Теперь надо запустить в нужном месте сессию, если стоит автоматический вход. Откроем index.php и напишем в самом начале страницы:

// вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички!!!
session_start();
include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
if (isset($_COOKIE["auto"]) and isset($_COOKIE["login"]) and isset($_COOKIE["password"]))
{//если есть необходимые переменные
if ($_COOKIE["auto"] == "yes") { // если пользователь желает входить автоматически, то запускаем сессии
$_SESSION["password"]=strrev(md5($_COOKIE["password"]))."b3p6f"; //в куках пароль был не зашифрованный, а в сессиях обычно храним зашифрованный
$_SESSION["login"]=$_COOKIE["login"];// сессия с логином
$_SESSION["id"]=$_COOKIE["id"];//идентификатор пользователя
}
}

Вот теперь нам даже выход не поможет, что бы сменить пользователя! В exit . php удаляются сессии, которые все равно создаются на index . php , благодаря cookie, которые хранятся очень долго! Давайте уж все-таки починим файл exit . php , а то он не функционален в случае автоматического входа. Надо всего лишь очистить в cookie автоматический вход, после удаления переменных из сессии:

Setcookie("auto", "", time()+9999999);//очищаем автоматический вход

Так же необходимо добавить в update _ user . php после обновления логина в сессии:

$_SESSION["login"] = $login;//Обновляем логин в сессии
if (isset($_COOKIE["login"])) {
setcookie("login", $login, time()+9999999);// Обновляем логин в куках
}

И то же самое с паролем

$result4 = mysql_query("UPDATE users SET password="$password" WHERE login="$old_login"",$db);// обновляем пароль
if ($result4=="TRUE") {//если верно, то обновляем его в сессии
$_SESSION["password"] = $password;
if (isset($_COOKIE["password"])) {
setcookie("password",$_POST["password"], time()+9999999);// Обновляем пароль в куках , если они есть
}

Ну вот и все. Надеюсь, что у Вас все получится! Удачи!

Доброго времени суток друзья! Давай с Вами рассмотрим регистрацию пользователей на PHP. Для начала давайте определим условия для нашей регистрации пользователей:

  • Пароль шифруем при помощи алгоритма MD5
  • Пароль будем "солить"
  • Проверка на занятость Логина
  • Активация пользователя письмом.
  • Запись и хранение данных в СУБД MySQL

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

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

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

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

Так как мы будем хранить все данные в СУБД MySQL , то давайте создадим не большую таблицу в которой будем хранить данные о регистрации.

Для начала нужно создать таблицу в базе данных. Таблицу назовем bez_reg где bez - это префикс таблицы, а reg название таблицы.

Структура таблицы: bez_reg

-- -- Структура таблицы `bez_reg` -- CREATE TABLE IF NOT EXISTS `bez_reg` (`id` int(11) NOT NULL AUTO_INCREMENT, `login` varchar(200) NOT NULL, `pass` varchar(32) NOT NULL, `salt` varchar(32) NOT NULL, `active_hex` varchar(32) NOT NULL, `status` int(1) NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Теперь создадим основные скрипты для дальнейшей работы.

Файл INDEX.PHP

Файл CONFIG.PHP

"); ?>

Файл 404.HTML

Ошибка 404

Ошибка 404

На странице произошла ошибка 404

Вернуться

Файл BD.PHP

Файл INDEX.HTML

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

Файл FUNCT.PHP

"."\n"; if(is_array($data)) { foreach($data as $val) $err .= "

  • ". $val ."
  • "."\n"; } else $err .= "
  • ". $data ."
  • "."\n"; $err .= ""."\n"; return $err; } /**Простая обертка для запросов к MySQL * @param string $sql */ function mysqlQuery($sql) { $res = mysql_query($sql); /* Проверяем результат Это показывает реальный запрос, посланный к MySQL, а также ошибку. Удобно при отладке.*/ if(!$res) { $message = "Неверный запрос: " . mysql_error() . "\n"; $message .= "Запрос целиком: " . $sql; die($message); } return $res; } /**Простой генератор соли * @param string $sql */ function salt() { $salt = substr(md5(uniqid()), -8); return $salt; }

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

    Файл REG.PHP

    Вы успешно зарегистрировались! Пожалуйста активируйте свой аккаунт!!"; //Производим активацию аккаунта if(isset($_GET["key"])) { //Проверяем ключ $sql = "SELECT * FROM `". BEZ_DBPREFIX ."reg` WHERE `active_hex` = "". escape_str($_GET["key"]) ."""; $res = mysqlQuery($sql); if(mysql_num_rows($res) == 0) $err = "Ключ активации не верен!"; //Проверяем наличие ошибок и выводим пользователю if(count($err) > 0) echo showErrorMessage($err); else { //Получаем адрес пользователя $row = mysql_fetch_assoc($res); $email = $row["login"]; //Активируем аккаунт пользователя $sql = "UPDATE `". BEZ_DBPREFIX ."reg` SET `status` = 1 WHERE `login` = "". $email ."""; $res = mysqlQuery($sql); //Отправляем письмо для активации $title = "Ваш аккаунт на http://сайт успешно активирован"; $message = "Поздравляю Вас, Ваш аккаунт на http://сайт успешно активирован"; sendMessageMail($email, BEZ_MAIL_AUTOR, $title, $message); /*Перенаправляем пользователя на нужную нам страницу*/ header("Location:". BEZ_HOST ."less/reg/?mode=reg&active=ok"); exit; } } /*Если нажата кнопка на регистрацию, начинаем проверку*/ if(isset($_POST["submit"])) { //Утюжим пришедшие данные if(empty($_POST["email"])) $err = "Поле Email не может быть пустым!"; else { if(!preg_match("/^[email protected](+\.)+{2,6}$/i", $_POST["email"])) $err = "Не правильно введен E-mail"."\n"; } if(empty($_POST["pass"])) $err = "Поле Пароль не может быть пустым"; if(empty($_POST["pass2"])) $err = "Поле Подтверждения пароля не может быть пустым"; //Проверяем наличие ошибок и выводим пользователю if(count($err) > 0) echo showErrorMessage($err); else { /*Продолжаем проверять введеные данные Проверяем на совподение пароли*/ if($_POST["pass"] != $_POST["pass2"]) $err = "Пароли не совподают"; //Проверяем наличие ошибок и выводим пользователю if(count($err) > 0) echo showErrorMessage($err); else { /*Проверяем существует ли у нас такой пользователь в БД*/ $sql = "SELECT `login` FROM `". BEZ_DBPREFIX ."reg` WHERE `login` = "". escape_str($_POST["email"]) ."""; $res = mysqlQuery($sql); if(mysql_num_rows($res) > 0) $err = "К сожалению Логин: ". $_POST["email"] ." занят!"; //Проверяем наличие ошибок и выводим пользователю if(count($err) > 0) echo showErrorMessage($err); else { //Получаем ХЕШ соли $salt = salt(); //Солим пароль $pass = md5(md5($_POST["pass"]).$salt); /*Если все хорошо, пишем данные в базу*/ $sql = "INSERT INTO `". BEZ_DBPREFIX ."reg` VALUES("", "". escape_str($_POST["email"]) ."", "". $pass ."", "". $salt ."", "". md5($salt) ."", 0)"; $res = mysqlQuery($sql); //Отправляем письмо для активации $url = BEZ_HOST ."less/reg/?mode=reg&key=". md5($salt); $title = "Регистрация на http://сайт"; $message = "Для активации Вашего акаунта пройдите по ссылке ". $url .""; sendMessageMail($_POST["email"], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=reg&status=ok"); exit; } } } } ?>

    Файл REG_FORM.HTML

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

    E-mail*:
    Пароль*:
    Подтверждения пароля*:

    Поля со значком * обязательны для заполнения

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

    Файл AUTH.PHP

    0) echo showErrorMessage($err); else { /*Создаем запрос на выборку из базы данных для проверки подлиности пользователя*/ $sql = "SELECT * FROM `". BEZ_DBPREFIX ."reg` WHERE `login` = "". escape_str($_POST["email"]) ."" AND `status` = 1"; $res = mysqlQuery($sql); //Если логин совподает, проверяем пароль if(mysql_num_rows($res) > 0) { //Получаем данные из таблицы $row = mysql_fetch_assoc($res); if(md5(md5($_POST["pass"]).$row["salt"]) == $row["pass"]) { $_SESSION["user"] = true; //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=auth"); exit; } else echo showErrorMessage("Неверный пароль!"); } else echo showErrorMessage("Логин ". $_POST["email"] ." не найден!"); } } ?>

    Для тех у кого последняя версия PHP выкладываю данный скрипт с использованием PDO т.к. расширение MySQL устарело и было удалено из новой версии PHP. Скачать регистрация и авторизация php mysql pdo

    Архив обновлен 24.02.2015г.

    Внимание: Если вы используете данный скрипт на локальном сервере типа DENWER , XAMPP , то не стоит ждать писем на свой почтовый ящик. Письма лежат в заглушке sendmail . В Denwer вы их можете найти по пути Z:\tmp\!sendmail\ открыть данные файлы вы сможете в любом почтовом клиенте.

    Статьи по теме: