У дома Зъболечение Напишете регистрация на php. Проста система за регистрация на потребители

Напишете регистрация на php. Проста система за регистрация на потребители

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

1. Нека започнем със създаването на таблица потребители в базата данни. Той ще съдържа потребителски данни (вход и парола). Да отидем на phpmyadmin (ако създавате база данни на вашия компютър http://localhost/phpmyadmin/). Създаваме таблица потребители, тя ще има 3 полета.

Аз го създавам в базата данни mysql, вие можете да го създадете в друга база данни. След това задайте стойностите, както е на фигурата:

2. Необходима е връзка с тази таблица. Нека създадем bd.php файл. Съдържанието му:

В моя случай изглежда така:

Запазете bd.php.
Страхотен! Имаме таблица в базата данни и връзка с нея. Сега можете да започнете да създавате страница, на която потребителите ще оставят своите данни.

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



Регистрация


Регистрация


Вашият вход:




Твоята парола:








4. Създайте файл, който ще въведе данни в базата данни и ще запази потребителя. save_user.php (коментари вътре):

5. Сега нашите потребители могат да се регистрират! След това трябва да създадете „врата“ за вече регистрирани потребители, за да влязат в сайта. index.php (коментари вътре) :




Начална страница


Начална страница


Вашият вход:


Твоята парола:






Регистрирам



Добре, всичко свърши! Урокът може да е скучен, но много полезен. Тук е показана само идеята за регистрация, след което можете да я подобрите: добавете сигурност, дизайн, полета с данни, зареждане на аватари, излизане от вашия акаунт (за да направите това, просто унищожете променливите от сесията с функцията за ненастройване) и скоро. Късмет!

Проверих всичко, работи правилно!

Днес ще разгледаме експлоатацията на критична 1-дневна уязвимост в популярната CMS Joomla, която избухна в интернет в края на октомври. Ще говорим за уязвимости с номера CVE-2016-8869, CVE-2016-8870 и CVE-2016-9081. И трите идват от един код, който е пет за дълги годиниизнемогва в дълбините на рамката, чакайки времето си, само за да се освободи и да донесе със себе си хаос, хакнати сайтове и сълзи на невинни потребители на тази Joomla. Само най-храбрите и смели разработчици, чиито очи са червени от светлината на мониторите и чиито клавиатури са осеяни с трохи от хляб, успяха да предизвикат бушуващите зли духове и да положат главите си на олтара на поправките.

ПРЕДУПРЕЖДЕНИЕ Цялата информация е предоставена само за информационни цели. Нито редакторите, нито авторът носят отговорност за възможни вреди, причинени от материалите на тази статия. Откъдето започна всичко

На 6 октомври 2016 г. Демис Палма създаде тема в Stack Exchange, в която попита: защо всъщност във версия 3.6 на Joomla има два метода за регистриране на потребители с едно и също име register()? Първият е в контролера UsersControllerRegistration, а вторият е в контролера UsersControllerUser. Деймис искаше да разбере дали методът UsersControllerUser::register() е използван някъде, или това е просто еволюционен анахронизъм, останал от старата логика. Неговата загриженост беше, че дори ако този метод не се използва от нито един изглед, той може да бъде извикан от изработена заявка. На което получих отговор от разработчик под псевдонима itoctopus, който потвърди: проблемът наистина съществува. И изпрати доклад до разработчиците на Joomla.

Тогава събитията се развиха най-бързо. На 18 октомври разработчиците на Joomla приеха доклада от Damis, който по това време беше изготвил PoC, който ще позволи регистрация на потребители. Той публикува бележка на сайта си, където в общ контурговори за проблема, който откри, и мислите си по този въпрос. Излиза в същия ден нова версия Joomla 3.6.3, която все още съдържа уязвим код.

След това Davide Tampellini върти бъга, докато не бъде регистриран прост потребител, и администратора. И на 21 октомври нов случай пристига при екипа по сигурността на Joomla. Там вече се говори за увеличаване на привилегиите. В същия ден на уебсайта на Joomla се появява съобщение, че във вторник, 25 октомври, ще бъде пусната следващата версия със сериен номер 3.6.3, която коригира критична уязвимост в ядрото на системата.

25 октомври Joomla Security Strike Team открива най-новия проблем, създаден от парчето код, открито от Damis. След това ангажимент от 21 октомври с невзрачното име Prepare 3.6.4 Stable Release се вкарва в главния клон на официалното хранилище на Joomla, което поправя злополучния бъг.

След това излизане много заинтересовани лица се присъединяват към общността на разработчиците - те започват да популяризират уязвимостта и да подготвят експлойти.

На 27 октомври изследователят Хари Робъртс качва готов експлойт в хранилището на Xiphos Research, който може да качи PHP файл на сървър с уязвима CMS.

Подробности

Е, предисторията приключи, нека да преминем към най-интересната част - анализ на уязвимостта. Инсталирах Joomla 3.6.3 като тестова версия, така че всички номера на редове ще бъдат подходящи за тази версия. И всички пътища до файловете, които ще видите по-долу, ще бъдат посочени спрямо корена на инсталирания CMS.

Благодарение на откритието на Damis Palma знаем, че има два метода, които извършват регистрация на потребители в системата. Първият се използва от CMS и се намира във файла /components/com_users/controllers/registration.php:108. Вторият (този, който ще трябва да извикаме) живее в /components/com_users/controllers/user.php:293. Нека го разгледаме по-отблизо.

286: /** 287: * Метод за регистриране на потребител. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: */ 293: public function register() 294: ( 295: JSession::checkToken("post") или jexit(JText::_ ("JINVALID_TOKEN")); // Получаване на данни от формуляра . 315: $return = $model->validate($form, $data); 316: 317: // Проверка за грешки 318: if ($return === false) 319: ( ... 345: / /. Завършете регистрацията 346: $return = $model->register($data);

Тук оставих само интересни редове. Пълната версия на уязвимия метод може да се види в хранилището на Joomla.

Нека да разберем какво се случва по време на нормална потребителска регистрация: какви данни се изпращат и как се обработват. Ако регистрацията на потребител е активирана в настройките, формулярът може да бъде намерен на http://joomla.local/index.php/component/users/?view=registration.


Законната заявка за регистрация на потребител изглежда като следната екранна снимка.


Компонентът com_users отговаря за работата с потребителите. Обърнете внимание на параметъра на задачата в заявката. Той има формат $controller.$method. Нека да разгледаме файловата структура.

Имената на скриптовете в папката с контролери съответстват на имената на извиканите контролери. Тъй като нашата заявка вече има $controller = "registration", файлът registration.php и неговият метод register() ще бъдат извикани.

Внимание, въпрос: как да прехвърлите обработката на регистрацията на уязвимо място в кода? Вероятно вече се досещате. Имената на уязвимите и реалните методи са еднакви (register), така че просто трябва да променим името на извикания контролер. Къде се намира нашият уязвим контролер? Точно така, във файла user.php. Оказва се, че $controller = "user". Събирайки всичко заедно, получаваме task = user.register. Сега заявката за регистрация се обработва по метода, от който се нуждаем.


Второто нещо, което трябва да направим, е да изпратим данните в правилния формат. Тук всичко е просто. Legitimate register() очаква от нас масив, наречен jform, в който предаваме регистрационни данни - име, вход, парола, имейл (вижте екранната снимка със заявката).

  • /components/com_users/controllers/registration.php: 124: // Вземете потребителските данни. 125: $requestData = $this->input->post->get("jform", array(), "array");

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

  • /components/com_users/controllers/user.php: 301: // Вземете данните от формуляра. 302: $data = $this->input->post->get("user", array(), "array");

Затова променяме имената на всички параметри в заявката от jfrom на user.

Нашата трета стъпка е да намерим валиден CSRF токен, тъй като без него няма да има регистрация.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") или jexit(JText::_("JINVALID_TOKEN"));

Изглежда като MD5 хеш и можете да го вземете например от формуляра за оторизация на сайта /index.php/component/users/?view=login.


Сега можете да създавате потребители, като използвате желания метод. Ако всичко работи, тогава поздравления - току-що сте използвали уязвимостта CVE-2016-8870 „липсваща проверка на разрешение за регистриране на нови потребители“.

Ето как изглежда в „работещия“ метод register() от контролера UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Ако регистрацията е деактивирана - Пренасочване към страницата за вход. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=) вход", невярно)); 117: 118: връщане невярно; 119: )

И така в уязвими:

  • /components/com_users/controllers/user.php:

Да, няма начин.

За да разберем втория, много по-сериозен проблем, нека изпратим заявката, която създадохме, и да видим как се изпълнява в различни части на кода. Ето частта, която отговаря за валидирането на подадените от потребителя данни в работния метод:

Продължаването е достъпно само за членове Вариант 1. Присъединете се към общността на сайта, за да прочетете всички материали на сайта

Членството в общността в рамките на посочения период ще ви даде достъп до ВСИЧКИ хакерски материали, ще увеличи личната ви кумулативна отстъпка и ще ви позволи да натрупате професионален рейтинг на Xakep Score!

Laravel изисква Composer да управлява зависимостите на проекта. Така че, преди да инсталирате Laravel, уверете се, че имате инсталиран Composer на вашата система. В случай, че чувате за Composer за първи път, това е инструмент за управление на зависимости за php, подобен на npm на node.

За да инсталирате Composer на вашата машина, проверете тази публикация:

Инсталиране на Laravel на Windows:

Следвайте стъпките по-долу, за да инсталирате laravel на Windows машина. Без значение, че имате xampp/wamp стек, той работи и за двете. На WAMP не забравяйте да инсталирате laravel в папка "www" и в XAMPP, очевидно "htdocs".

СТЪПКА-1) Отворете папката „htdocs“ на XAMPP, задръжте клавиша SHIFT и щракнете с десния бутон върху папката и изберете „отвори командния прозорец тук“. Като алтернатива можете да отворите командния прозорец и да промените директорията на "xampp/htdocs".

СТЪПКА-2) Въведете следната команда.

Композитор create-project laravel/laravel my_laravel_site --prefer-dist

Тук "my_laravel_site" е името на папката, където ще бъдат инсталирани файловете на laravel. Променете това по ваш вкус.

СТЪПКА-3) Сега е време да бъдете търпеливи, тъй като инсталирането на laravel ще отнеме известно време.

СТЪПКА-4) След инсталиране променете директорията на "my_laravel_site" (cd "my_laravel_site") в командния ред и въведете командата по-долу.

Php занаятчийска услуга

СТЪПКА-5) Това ще покаже съобщение нещо като „Сървърът за разработка на Laravel стартира:“ заедно с url.

СТЪПКА-6) Копирайте и поставете URL адреса в браузъра. Ако нещата вървят както трябва, ще видите началния екран на laravel.

СТЪПКА-7) Готово! Успешно сте инсталирали laravel на Windows машина и сте готови за работа.

Задаване на ключ на приложението:

Laravel изисква малко конфигурация след инсталиране. Изисква да зададете ключа на приложението. Това е случаен низ от 32 знака, използван за криптиране на сесия и други чувствителни данни. Обикновено това ще бъде зададено автоматично, когато инсталирате laravel чрез композитор или инсталатор на laravel.

В случай, че не е зададено, трябва да го направите ръчно. Първо се уверете, че сте преименували файла ".env.example" на ".env" в корена на вашето приложение. След това отворете командния ред и преминете към папката на проекта laravel. Сега изпълнете командата по-долу, за да генерирате ключа.

Php занаятчийски ключ: генериране

Копирайте този генериран ключ в променливата APP_KEY на файла ".env". Запазете и сте готови.

Инсталиране на конкретна версия на Laravel:

Посоченият по-горе метод ще накара композитора да изтегли и инсталира най-новата версия на laravel. Ако искате да инсталирате по-стари версии на laravel на вашата машина, не забравяйте да включите съответния номер на версия в командата create-project.

Композитор create-project laravel/laravel=5.4 your-project-name --prefer-dist Прочетете също:

По същия начин можете лесно инсталирайте laravel с помощта на композитор на windows. Надявам се да намерите този урок за полезен. Моля, споделете го в социалния си кръг, ако ви харесва.

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

В днешния урок ще разработим проста система за регистрация, която няма да изисква никакви пароли! Резултатите ще бъдат система, която може лесно да се модифицира или интегрира в съществуващ уебсайт на PHP. Ако се интересувате, продължете да четете.

PHP

Сега сме готови да започнем с PHP кода. Основната функционалност на системата за регистрация се осигурява от класа User, който можете да видите по-долу. Класът използва (), което е минималистична библиотека с бази данни. Потребителският клас е отговорен за достъпа до базите данни, генерирането на маркери за влизане и валидирането им. Представя ни прост интерфейс, който може лесно да бъде включен в системата за регистрация на вашите уебсайтове, базирани на PHP.

User.class.php

// Частен екземпляр на ORM
частна $orm;

/**
* Намерете потребител по символичен низ. Вземат се само валидни жетони
* съображение. Токенът е валиден 10 минути след генерирането му.
* @param низ $token Знакът за търсене
* @return потребител
*/

Публична статична функция findByToken($token)(

// намерете го в базата данни и се уверете, че клеймото за време е правилно


->къде ("токен", $токен)
->where_raw("token_validity > NOW()")
->find_one();

Ако(!$резултат)(
връща невярно;
}

Връща нов потребител ($резултат);
}

/**
* Или влезте, или регистрирайте потребител.
* @return потребител
*/

Публична статична функция loginOrRegister($email)(

// Ако такъв потребител вече съществува, върнете го

Ако(Потребител::съществува($имейл))(
върне нов потребител ($ имейл);
}

// В противен случай го създайте и го върнете

Връщане на потребител::create($email);
}

/**
* Създайте нов потребител и го запазете в базата данни
* @param string $email Имейл адресът на потребителя
* @return потребител
*/

Частна статична функция create($email)(

// Запишете нов потребител в базата данни и го върнете

$result = ORM::for_table("reg_users")->create();
$result->email = $email;
$result->save();

Връща нов потребител ($резултат);
}

/**
* Проверете дали такъв потребител съществува в базата данни и върнете булево значение.
* @param string $email Имейл адресът на потребителя
* @return boolean
*/

Съществува публична статична функция($email)(

// Съществува ли потребителят в базата данни?
$резултат = ORM::for_table("reg_users")
->къде ("имейл", $имейл)
->броене();

Връща $result == 1;
}

/**
* Създайте нов потребителски обект
* @param $param ORM екземпляр, id, имейл или нула
* @return потребител
*/

Публична функция __construct($param = null)(

If($param instanceof ORM)(

// Предаден е екземпляр на ORM
$this->orm = $param;
}
иначе if(is_string($param))(

// Предаден е имейл
$това->
->къде ("имейл", $param)
->find_one();
}
иначе(

If(is_numeric($param))(
// Идентификационният номер на потребител е предаден като параметър
$id = $param;
}
else if(isset($_SESSION["loginid"]))(

// Не е подаден потребителски идентификатор, погледнете сесията
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->къде ("id", $id)
->find_one();
}

/**
* Генерира нов SHA1 токен за влизане, записва го в базата данни и го връща.
* @return низ
*/

Публична функция 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();

Върнете $token;
}

/**
*Влезте с този потребител
* @return void
*/

Публична функция login()

// Маркирайте потребителя като влязъл
$_SESSION["loginid"] = $this->orm->id;

// Актуализиране на db полето last_login
$this->orm->set_expr("last_login", "NOW()");
$this->orm->save();
}

/**
* Унищожаване на сесията и излизане на потребителя.
* @return void
*/

Изход от публична функция()
$_SESSION = масив();
деактивирано ($_SESSION);
}

/**
* Проверете дали потребителят е влязъл.
* @return boolean
*/

Публична функция loggedIn())(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Проверете дали потребителят е администратор
* @return boolean
*/

Публична функция isAdmin())(
върне $this->rank() == "администратор";
}

/**
* Намерете типа потребител. Може да бъде администратор или обикновен.
* @return низ
*/

Публична функция rank())(
if($this->orm->rank == 1)(
върнете "администратор";
}

Връщане "редовно";
}

/**
* Магически метод за достъп до частните елементи
* $orm екземпляр като свойства на потребителския обект
* @param string $key Името на достъпното свойство
* @return смесено
*/

Публична функция __get($key)(
if(isset($this->orm->$key))(
върне $this->orm->$key;
}

Върни нула;
}
}
Токените се генерират с помощта на алгоритъм и се съхраняват в база данни. Използваме MySQL, за да настроим колоната token_validity на 10 минути. Когато валидираме токен, казваме на двигателя, че имаме нужда от токен, полето token_validity все още не е изтекло. По този начин ограничаваме времето, през което токенът ще бъде валиден.

Забележете, че използваме магическия метод __get() в края на документа за достъп до свойствата на потребителския обект. Това ни позволява достъп до данни, които се съхраняват в базата данни като свойства: $user->email, $user->token. Като пример, нека видим как можем да използваме този клас в следния кодов фрагмент:


Друг файл, който съхранява необходимата функционалност е functions.php. Там имаме няколко помощни функции, които ни позволяват да поддържаме останалата част от кода по-чист.

Функции.php

Функция send_email($from, $to, $subject, $message)(

// Помощна функция за изпращане на имейл

$headers = "MIME-версия: 1.0" . "\r\n";
$headers .= "Content-type: text/plain; charset=utf-8" . "\r\n";
$headers .= "От: ".$от . "\r\n";

Обратна поща ($до, $тема, $съобщение, $заглавия);
}

функция get_page_url())(

// Намерете URL адреса на PHP файл

$url = "http".(празен($_SERVER["HTTPS"])?"":"s")."://".$_SERVER["SERVER_NAME"];

If(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")(
$url.= $_SERVER["REQUEST_URI"];
}
иначе(
$url.= $_SERVER["PATH_INFO"];
}

Връщане на $url;
}

функция rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)(

// Броят опити за влизане за последния час от този IP адрес

$count_hour = ORM::for_table("reg_login_attempt")
->
->where_raw("ts > SUBTIME(NOW(),"1:00")")
->броене();

// Броят опити за влизане за последните 10 минути от този IP адрес

$count_10_min = ORM::for_table("reg_login_attempt")
->къде("ip", sprintf("%u", ip2long($ip)))
->where_raw("ts > SUBTIME(NOW(),"0:10")")
->броене();

If($count_hour > $limit_hour || $count_10_min > $limit_10_min)(
throw new Exception("Твърде много опити за влизане!");
}
}

функция 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();
}

функция redirect($url)(
заглавие ("Местоположение: $url");
изход;
}
Функциите rate_limit и rate_limit_tick ни позволяват да ограничим броя на опитите за авторизация за определен период от време. Опитите за оторизация се записват в базата данни reg_login_attempt. Тези функции се задействат, когато формулярът за вход е потвърден, както можете да видите в следния кодов фрагмент.

Кодът по-долу е взет от index.php и отговаря за валидирането на формата за влизане. Той връща JSON отговор, който се управлява от jQuery кода, който видяхме в активи/js/script.js.

index.php

If(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))(

// Изведе JSON заглавка

Header("Content-type: application/json");

// Валиден ли е имейл адресът?

If(!isset($_POST["имейл"]) || !filter_var($_POST["имейл"], FILTER_VALIDATE_EMAIL))(
throw new Exception("Моля, въведете валиден имейл.");
}

// Това ще хвърли изключение, ако лицето е по-горе
// разрешените ограничения за опити за влизане (вижте functions.php за повече):
rate_limit($_SERVER["REMOTE_ADDR"]);

// Запишете този опит за влизане
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["имейл"]);

// Изпратете съобщението до потребителя

$message = "";
$имейл = $_POST["имейл"];
$subject = "Вашата връзка за вход";

If(!User::exists($email))(
$subject = "Благодарим ви за регистрацията!";
$message = "Благодарим Ви за регистрацията в нашия сайт!\n\n";
}

// Опит за влизане или регистрация на лицето
$user = Потребител::loginOrRegister($_POST["имейл"]);

$message.= "Можете да влезете от този URL:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Връзката ще изтече автоматично след 10 минути.";

$result = send_email($fromEmail, $_POST["email"], $subject, $message);

Ако(!$резултат)(
throw new Exception("Възникна грешка при изпращането на вашия имейл. Моля, опитайте отново.");
}

Die(json_encode(масив(
"message" => "Благодарим ви! Изпратихме връзка към входящата ви кутия. Проверете и папката си със спам."
)));
}
}
catch(Изключение $e)(

Die(json_encode(масив(
"грешка"=>1,
"съобщение" => $e->getMessage()
)));
}
При успешна авторизация или регистрация, горният код изпраща имейл до лицето с връзка за авторизация. Токенът е достъпен като $_GET променлива "tkn" поради генерирания URL адрес.

index.php

If(isset($_GET["tkn"]))(

// Това валиден токен за влизане ли е?
$user = Потребител::findByToken($_GET["tkn"]);

// Да! Влезте в потребителя и пренасочете към защитената страница.

$user->login();
пренасочване ("защитен.php");
}

// Невалиден Жетон. Пренасочване обратно към формата за вход.
пренасочване ("index.php");
}
Изпълнението на $user->login() ще създаде необходимите променливи на сесията, което ще позволи на потребителя да остане влязъл при следващи влизания.

Излизането от системата се осъществява приблизително по същия начин:

Index.php

If(isset($_GET["logout"]))(

$user = нов потребител();

If($user->loggedIn())(
$user->logout();
}

Пренасочване("index.php");
}
В края на кода пренасочваме потребителя отново към index.php, така че параметърът?logout=1 в URL адреса се елиминира.

Нашият файл index.php също ще се нуждае от защита - не искаме вече влезли потребители да виждат формуляра. За да направим това, използваме метода $user->loggedIn():

Index.php

$user = нов потребител();

if($user->loggedIn())(
пренасочване ("защитен.php");
}
И накрая, нека да разгледаме как можете да защитите страницата на уебсайта си и да я направите достъпна само след разрешение:

защитен.php

// За да защитите всяка php страница на вашия сайт, включете main.php
// и създайте нов потребителски обект. Толкова е просто!

require_once "includes/main.php";

$потребител = нов потребител();

if(!$user->loggedIn())(
пренасочване ("index.php");
}
След тази проверка можете да сте сигурни, че потребителят е влязъл успешно. Ще имате също достъп до данни, които се съхраняват в базата данни като свойства на обекта $user. За да покажете имейла на потребителя и неговия ранг, използвайте следния код:

Echo "Вашият имейл: ".$user->email;
echo "Вашият ранг: ".$user->rank();
Тук rank() е методът, тъй като колоната за ранг в базата данни обикновено съдържа числа (0 за обикновени потребители и 1 за администратори) и трябва да преобразуваме всички тях в имена на ранг, което се реализира с този метод. За да преобразувате стандартен потребител в администратор, просто редактирайте записа на потребителя в phpmyadmin (или друга програма за база данни). Като администратор, потребителят няма да има никакви права специални функции. Вие сами имате право да изберете какви права да предоставите на администраторите.

Готов!

С това нашата проста система за регистрация е готова! Можете да го използвате на съществуващ PHP сайт или да го модернизирате, за да отговаря на вашите собствени изисквания.

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

Най-големият регистратор и хостинг доставчик в Русия.

Повече от 2 милиона имена на домейни в услуга.

Промоция, домейн поща, бизнес решения.

Повече от 700 хиляди клиенти по света вече са направили своя избор.

*Задръжте мишката, за да спрете превъртането на пауза.

Назад напред

Създаване на проста система за регистрация на потребители в PHP и MySQL

Създаването на система за регистрация е много работа. Трябва да напишете код, който валидира имейл адреси, изпраща имейл, потвърждаващ регистрацията, и също валидира други полета на формуляра и много повече.

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

В този урок ще създадем много проста система за регистрация, която изобщо не изисква и не съхранява пароли! Резултатът ще бъде лесен за модифициране и добавяне към съществуващ PHP сайт. Искате ли да разберете как работи? Прочетете по-долу.



Ето как ще работи нашата супер проста система:

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

След това се създава случаен уникален набор от знаци (токен), който се изпраща на посочения от потребителя имейл под формата на връзка, която ще бъде релевантна за 10 минути;
- Връзката отвежда потребителя към нашия уебсайт. Системата определя наличието на токен и оторизира потребителя;

Предимства на този подход:

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

недостатъци:

Сигурност на потребителския акаунт. Ако някой има достъп до пощата на потребителя, той може да влезе.
- Имейлът не е защитен и може да бъде прихванат. Имайте предвид, че този въпрос е от значение и в случай, че паролата е забравена и трябва да бъде възстановена или във всяка система за оторизация, която не използва HTTPS за пренос на данни (вход/парола);
- Докато конфигурирате пощенския си сървър правилно, има вероятност съобщенията с връзки за оторизация да попаднат в спам;

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

Затова се препоръчва да се използва за регистрации във форуми и услуги, които не работят с важна информация.

Как да използвате тази система

В случай, че просто трябва да използвате система за упълномощаване на потребители на вашия сайт и не искате да вземете този урок на парчета, ето какво трябва да направите:

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

Require_once "includes/main.php"; $потребител = нов потребител(); if(!$user->loggedIn())( redirect("index.php"); )
- Готов!

За тези, които се интересуват как работи всичко, прочетете по-долу!

Първата стъпка е да напишете HTM кода за формуляра за оторизация. Този код се намира във файла index.php. Този файл също съдържа PHP код, който обработва данни от формуляри и други полезни системни функции за влизане. Можете да научите повече за това в раздела по-долу, посветен на прегледа на PHP кода.

index.php

Урок: Супер проста система за регистрация с PHP и MySQL Влезте или се регистрирайте

Въведете вашия имейл адрес по-горе и ние ще изпратим
вие връзка за вход.

Вход/Регистрация

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


JavaScript

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

активи/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"); $.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"); )); ;

е добавен към формуляра за показване сегашно състояние AJAX заявка (това стана възможно благодарение на методите ajaxStart()) И ajaxComplete(), който можете да намерите към края на файла).

Този клас показва въртящ се анимиран GIF файл (сякаш за да ни подскаже, че заявката се обработва) и също така действа като флаг, за да предотврати повторно изпращане на формуляра (когато бутонът за регистрация вече е щракнат веднъж). Класът .loggedIn е друг флаг - задава се при изпращане на имейла. Този флаг незабавно блокира всякакви по-нататъшни действия с формуляра.

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

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


Схема на потребителска таблица.

Системата не използва пароли, както се вижда от диаграмата. На него можете да видите колоната с токени с токени, съседни на колоната token_validity. Токенът се инсталира веднага щом потребителят се свърже със системата и настрои своя имейл за изпращане на съобщение (повече за това в следващия блок). Колоната token_validity задава времето 10 минути по-късно, след което токенът вече не е валиден.


Схема на таблица, която отчита броя на опитите за оторизация.

И в двете таблици IP адресът се съхранява в обработен вид, като се използва функцията ip2long в поле от тип integer.

Сега можем да напишем малко PHP код. Основната функционалност на системата е възложена на класа User.class.php, който можете да видите по-долу.

Този клас активно използва idorm (docs), тези библиотеки са минимално необходимите инструменти за работа с бази данни. Той управлява достъпа до базата данни, генерирането на токени и валидирането на токени. Той предоставя прост интерфейс, който улеснява свързването на система за регистрация към вашия сайт, ако използва PHP.

User.class.php

Class User( // Private ORM case private $orm; /** * Намерете потребител по токен. Само валидни токени се приемат за разглеждане. Токенът се генерира само за 10 минути от момента, в който е създаден * @param string $token . Това е токенът, който търсим * @return User Върнете стойността на функцията User */ public static function findByToken($token)( // намерете токена в базата данни и се уверете, че е зададен правилният времеви печат $. резултат = 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. вече съществува, връща стойността на функцията User от посочения имейл адрес, съхранен в базата данни if(User::exists($email))( return new User($email); ) // В противен случай създайте нов потребител в база данни и връща стойността на функцията User::create от посочения имейл return User::create($email); ) /** * Създайте нов потребител и запишете в базата данни * @param низ $email. Имейл адрес на потребител * @return User */ private static function create($email)( // Напишете нов потребител и върнете резултата от функцията User от тези стойности $result = ORM::for_table("reg_users")- >create(); $result->save(); return new User($result); /** Проверете дали такъв потребител съществува в базата данни и върнете булевата стойност променлива * @param низ $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 или 0 * @return User */ public function __construct($param = null) ( if($param instanceof ORM)( // Проверката на ORM премина $this->orm = $param; ) else if(is_string($param))( // Проверката на имейл премина $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(); връща $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 */ публична функция isAdmin())( return $this->rank() = = "administrator"; ) /** * Намерете потребителския тип, може да бъде администратор или обикновен * @return string */ public function rank())( if( $this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Метод, който ви позволява да получите личната информация на потребителя *като свойства на потребителския обект * @param низ $key Името на свойството, което получава достъп * @return mixed */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm->$ ключ; ) върне нула; ) )

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

Когато токенът е валидиран, ние директно казваме на манипулатора, че разглеждаме само токени, които все още не са изтекли, съхранени в колоната token_validity.

Моля, обърнете внимание, че използвам магическия метод __получи docs библиотека в края на файла, за да прихване достъпа до свойствата на потребителския обект.

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


Защитена страница

Друг файл, който съхранява полезна и необходима функционалност, е файлът functions.php. Има няколко така наречени помощници - помощни функции, които ви позволяват да създавате по-чист и по-четлив код в други файлове.

functions.php

Функция send_email($from, $to, $subject, $message)( // Помощник, който изпраща имейл $headers = "MIME-Версия: 1.0" . "\r\n"; $headers .= "Content-type: text /plain; charset=utf-8" . "\r\n"; $headers .= "От: ".$from . "\r\n"; върната поща($to, $subject, $message, $headers ); ) функция 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("Твърде много опити за влизане!"); ) ) function rate_limit_tick($ip, $email)( // Създаване на нов запис в таблицата който отчита броя опити за влизане $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save(); ) function redirect($url)(header("Местоположение: $url"); изход; )

Функции скорост_лимитИ скорост_лимит_отметкаследи броя на опитите за авторизация през изминалия период от време от първия опит. Опитът за влизане се записва в базата данни в колоната reg_login_attempt. Тези функции се извикват, когато данните от формуляра се обработват и изпращат, както можете да видите от следния кодов фрагмент.

Кодът по-долу е взет от файла index.php и обработва изпращането на формуляра. Той връща JSON отговор, който от своя страна се обработва от jQuery във файла активи/js/script.js, който разгледахме по-рано.

index.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Изведе JSON header header("Content-type: application/json"); // Този имейл адрес валиден ли е, ако (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Моля, въведете валиден имейл."); ) // Проверете потребителят има право да влиза, превишил ли е броя на разрешените връзки (файл functions.php за повече информация) rate_limit($_SERVER["REMOTE_ADDR"]); , $ _POST["email"]); // Изпратете имейл до потребителя $message = ""; Благодарим ви за регистрацията!"; $message = "Благодарим ви за регистрацията в нашия сайт!\n\n"; ) // Опит за оторизиране или регистриране на потребител $user = User::loginOrRegister($_POST[ "email"] ); $message.= "Можете да влезете от този URL:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Връзката ще изтече автоматично след 10 минути."; $result = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( throw new Exception("Възникна грешка при изпращането на вашия имейл. Моля, опитайте отново."); ) die(json_encode(array("message" => "Благодарим ви! Изпратихме връзка във входящата си поща. Проверете и папката си със спам."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() )));

След успешно влизане/регистрация, кодът по-горе ще изпрати на потребителя връзка за влизане. Токенът става достъпен, защото той се предава като променлива в генерираната връзка от метода $_GETс ткн маркер

index.php

If(isset($_GET["tkn"]))( // Този токен валиден ли е за оторизация? $user = User::findByToken($_GET["tkn"]); if($user)( // Да, е. Пренасочване към защитената страница $user->login(); redirect("protected.php"); // Пренасочване към страницата с формуляра за авторизация/регистрация ("index.php )."); )

$user->login()

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

Обработката на функцията за излизане от системата е организирана по подобен начин.

index.php

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

В края на кода отново задавам пренасочване към index.php, така че параметърът ?изход=1не се изисква предаване чрез URL.

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

index.php

$потребител = нов потребител(); if($user->loggedIn())( redirect("protected.php"); )

И накрая, ето част от кода, който ви позволява да защитите страниците на вашия сайт и да ги направите достъпни само след оторизация.

защитен.php

// За да защитите всяка страница на вашия сайт, включете файл main.php // и създайте нов потребителски обект. Ето колко е лесно! require_once "includes/main.php"; $потребител = нов потребител(); if(!$user->loggedIn())( redirect("index.php"); )

След тази проверка можете да сте сигурни, че потребителят е успешно упълномощен. Можете също така да получите достъп до съхранена информация в базата данни, като използвате свойствата на обекта $потребител. За да покажете имейла и статуса на потребителя, използвайте този код:

Echo "Вашият имейл: ".$user->email; echo "Вашият ранг: ".$user->rank();

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

За да направите обикновен потребител администратор, просто редактирайте потребителския запис чрез phpMyAdmin (или всяка друга програма, която ви позволява да управлявате бази данни). Статусът на администратор не дава никакви привилегии; в този пример страницата ще показва, че сте администратор - и това е всичко.

Но какво да правите с това е оставено на ваша преценка; можете сами да напишете и съставите код, който задава определени привилегии и възможности за администраторите.

Ние сме готови!

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

Материалът е подготвен от Денис Малишок специално за уебсайта

P.S. Искате ли да продължите напред в овладяването на PHP и ООП? Обърнете внимание на премиум уроците по различни аспекти на изграждането на уебсайтове, включително програмиране в PHP, както и безплатен курс за създаване на ваша собствена CMS система в PHP от нулата с помощта на OOP:

Хареса ли ви материала и искате да ми благодарите?
Просто споделете с вашите приятели и колеги!




Ново в сайта

>

Най - известен