Додому Лікування зубів Написати реєстрацію на PHP. Проста система реєстрації користувачів

Написати реєстрацію на PHP. Проста система реєстрації користувачів

Вітаю! Зараз ми спробуємо реалізувати найпростішу реєстрацію на сайті з допомогою PHP+ MySQL. Для цього на вашому комп'ютері потрібно встановити Apache. Нижче наведено принцип роботи нашого скрипта.

1. Почнемо зі створення таблички users у базі . Вона міститиме дані користувача (логін та пароль). Зайдемо до phpmyadmin (якщо ви створюєте базу на своєму ПК http://localhost/phpmyadmin/). Створюємо таблицю users, у ній буде 3 поля.

Я створюю її в базі mysql, ви можете створювати в іншій базі. Далі встановлюємо значення, як у малюнку:

2. Необхідне з'єднання з цією таблицею.

Давайте створимо файл bd.php. Його зміст:

У моєму випадку це виглядає так:
Зберігаємо bd.php.

Чудово! Ми маємо таблицю в базі, з'єднання до неї. Тепер можна приступати до створення сторінки, на якій користувачі залишатимуть свої дані.



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


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


Реєстрація




Ваш логін:








Ваш пароль:

4. Створюємо файл, який заноситиме дані в базу і зберігатиме користувача. save_user.php (коментарі всередині):




5. Тепер наші користувачі можуть реєструватися!


5. Тепер наші користувачі можуть реєструватися!


Реєстрація


Ваш логін:






Далі необхідно зробити "двері" для входу на сайт вже зареєстрованим користувачам. index.php (коментарі всередині):



Головна сторінка

Зареєструватись

Сьогодні ми розглянемо експлуатацію критичної 1day-уразливості у популярній CMS Joomla, яка прогриміла на просторах інтернету наприкінці жовтня. Йтиметься про вразливості з номерами CVE-2016-8869, CVE-2016-8870 та CVE-2016-9081. Усі три походять з одного шматочка коду, який п'ять довгих роківтомився в надрах фреймворку в очікуванні свого часу, щоб потім вирватися на волю і принести з собою хаос, зламані сайти та сльози ні в чому не винних користувачів цієї Joomla. Лише найдоблесніші і сміливіші розробники, чиї очі червоні від світла моніторів, а клавіатури завалені хлібними крихтами, змогли кинути виклик нечисті, що розбушувалася, і покласти її голову на вівтар фіксів.

WARNING Вся інформація надана виключно з ознайомлювальною метою. Ні редакція, ні автор не несуть відповідальності за будь-яку можливу шкоду, заподіяну матеріалами цієї статті. З чого все почалося

6 жовтня 2016 Деміс Пальма (Demis Palma) створив топік на Stack Exchange , в якому поцікавився: а чому, власне, в Joomla версії 3.6 існують два методи реєстрації користувачів з однаковою назвою register() ? Перший знаходиться в контролері UsersControllerRegistration, а другий - у UsersControllerUser. Деміс хотів дізнатися, чи використовується десь метод UsersControllerUser::register() , або це лише еволюційний анахронізм, що залишився від старої логіки. Його турбував той факт, що навіть якщо цей метод не використовується жодним уявленням, він може бути викликаний за допомогою сформованого запиту. На що отримав відповідь від девелопера під ніком itoctopus, який підтвердив: проблема справді існує. І направив звіт розробникам Joomla.

Далі події розвивалися найшвидшим чином. 18 жовтня розробники Joomla приймають репорт Деміса, який на той час накидав PoC, що дозволяє реєструвати користувача. Він опублікував замітку на своєму сайті, де в загальних рисахрозповів про знайдену проблему та думки з цього приводу. Цього ж дня виходить Нова версія Joomla 3.6.3, яка все ще містить вразливий код.

Після цього Давид Тампелліні (Davide Tampellini) розкручує баг до стану реєстрації не простого користувача, а адміністратора. І вже 21 жовтня команді безпеки Joomla прилітає новий кейс. У ньому вже йдеться про підвищення привілеїв. У цей же день на сайті Joomla з'являється анонс про те, що у вівторок, 25 жовтня, буде випущено чергову версію з порядковим номером 3.6.3, яка виправляє критичну вразливість в ядрі системи.

25 жовтня Joomla Security Strike Team знаходить останню проблему, яку створює виявлений Деміс кусок коду. Потім у головну гілку офіційного репозиторію Joomla пушиться коміт від 21 жовтня з непримітною назвою Prepare 3.6.4 Stable Release, який фіксує злощасний баг.

Після цього камін-ауту до міжсобойчика розробників підключаються численні зацікавлені особи - починають розкручувати вразливість і готувати сплоїти.

27 жовтня дослідник Гаррі Робертс (Harry Roberts) викладає в репозиторій Xiphos Research готовий експлоїт, який може завантажувати PHP-файл на сервер із вразливою CMS.

Деталі

Що ж, з передісторією покінчено, переходимо до найцікавішого – розбору вразливості. Як піддослідна версія я встановив Joomla 3.6.3, тому всі номери рядків будуть актуальні саме для цієї версії. А всі шляхи до файлів, які ти побачиш далі, вказуватимуться щодо кореня встановленої CMS.

Завдяки знахідці Деміса Пальми ми знаємо, що є два методи, які виконують реєстрацію користувача у системі. Перший використовується CMS і знаходиться у файлі /components/com_users/controllers/registration.php:108. Другий (той, що нам і потрібно буде викликати), живе в /components/com_users/controllers/user.php:293. Подивимося на нього ближче.

286: /** 287: * Method to register a user. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: */ 293: public function register() 294: ( 295: JSession::checkToken("post") or jexit(JText::_ ("JINVALID_TOKEN")) ... 300: // Get the form data. 315: $return = $model->validate($form, $data); 318: / Finish the registration. 346: $return = $model->register($data);

Тут я залишив лише цікаві рядки. Повну версію вразливого методу можна переглянути у репозиторії Joomla.

Розберемося, що відбувається при звичайній реєстрації користувача: які дані надсилаються та як вони обробляються. Якщо реєстрація користувачів включена в налаштуваннях, форму можна знайти за адресою http://joomla.local/index.php/component/users/?view=registration .


Легітимний запит на реєстрацію користувача виглядає як наступний скріншот.


За роботу з користувачами відповідає компонент com_users. Зверніть увагу на параметр task у запиті. Він має формат $controller.$method. Погляньмо на структуру файлів.

Імена скриптів у папці controllers відповідають назвам контролерів, що викликаються. Так як у нашому запиті зараз $controller = "registration", то викличеться файл registration.php та його метод register().

Увага, питання: як передати обробку реєстрації вразливе місце в коді? Ти, напевно, вже здогадався. Імена вразливого і реального способів збігаються (register), тому нам досить змінити назву викликаного контролера. А де в нас знаходиться вразливий контролер? Правильно у файлі user.php . Виходить $controller = "user". Збираємо всі разом і отримуємо task=user.register. Тепер запит на реєстрацію опрацьовується потрібним нам методом.


Друге, що нам потрібно зробити, - це надіслати дані у правильному форматі. Тут усе просто. Легітимний register() чекає від нас масив під назвою jform, в якому ми передаємо дані для реєстрації - ім'я, логін, пароль, пошту (див. скріншот із запитом).

  • /components/com_users/controllers/registration.php: 124: // Get the user data.

125: $requestData = $this->input->post->get("jform", array(), "array");

  • Наш підопічний отримує ці дані з масиву з ім'ям user.

/components/com_users/controllers/user.php: 301: // Get the form data.

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"));

Ось як вона виглядає в робочому методі register() з контролера UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // If registration is disabled - Redirect to login page.

114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= login", false)); 117: 118: return false; 119: )

  • А так у вразливому:

/components/com_users/controllers/user.php:

Ага, ніяк.

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

Продовження доступне лише учасникам Варіант 1. Приєднайтесь до спільноти «сайт», щоб читати всі матеріали на сайті

Членство у спільноті протягом зазначеного терміну відкриє тобі доступ до ВСІХ матеріалів «Хакера», збільшить особисту накопичувальну знижку та дозволить накопичувати професійний рейтинг Xakep Score!

Laravel requires Composer для управління проектом dependencias. Так, як ви отримаєте Laravel, мабуть, ви маєте комп'ютера, який налаштований на вашій системі. У випадку ви маєте на увазі, що Composer для першого часу, це "залежне управління інструментом для php similar to node"s npm.

Для того, щоб встановити Composer on your machine, check this post:

Installing Laravel on Windows:

Натиснувши нижче кроки до налагодженого laravel на windows machine. Чи не мати, що має xampp/wamp stack, it works for both. На WAMP, мабуть, щоб встановити лауреат на "www" folder і на XAMPP, звичайно "htdocs".

STEP-1) Open "htdocs" folder on XAMPP, тримає SHIFT key and right click on the folder, and choose "open command window here". Крім того, ви можете відкрити комбінацію window and change directory to "xampp/htdocs".

STEP-2) Enter the following command.

Composer create-project laravel/laravel my_laravel_site --prefer-dist

Тут "my_laravel_site" є folder name, де laravel files will be installed. Зміна цього до вашого лікування.

STEP-3) Now it's time to be patient as laravel installation is going to take some time.

STEP-4) Одна installed, зміна директорії до "my_laravel_site" (cd "my_laravel_site") на клавішу prompt і натисніть нижче.

Php artisan serve

STEP-5) Це буде show message something like, "Laravel development server started:" along with url.

STEP-7) Done! Ви маєте успішно налагоджену мову на windows machine and ready to go with.

Setting Application Key:

Laravel потребує малого configuration after installation. Це потрібно, щоб вибрати application key. Це є рядом string of 32 characters long used for encrypting session and other sensitive data. Зазвичай це буде автоматично, коли ви налаштовуєте laravel via composer або laravel installer.

У випадку, якщо ви не маєте налаштування, ви повинні виконати його автоматично. Перший спосіб визнати ".env.example" файлом до ".env" на вашому застосунку керування. Now run the below command to generate the key.

Php artisan key:generate

Копію цього генерованого ключа до APP_KEY variable на файлі ".env". Save and you are done.

Installing Specific Laravel Version:

Докладніше про те, що спосіб буде складати комп'ютер для завантаження і налагодження останньої версії laravel. Якщо ви збираєтеся налагодити попередній версії електронної версії на вашому комп'ютері, ви можете включати в себе конкретну версію номера на створеному проекті команди.

Composer create-project laravel/laravel=5.4 your-project-name --prefer-dist Read Also:

Likewise you can easily install laravel using composer on windows. I hope you find this tutorial useful. Please share it on your social circle if you like it.

Процес створення системи реєстрації – це досить великий обсяг роботи. Вам потрібно написати код, який би перевіряв ще раз валідність email-адрес, висилав email-листи з підтвердженням, пропонував можливість відновити пароль, зберігав би паролі в безпечному місці, перевіряв форми введення та багато іншого. Навіть коли ви все це зробите, користувачі будуть реєструватися неохоче, тому що навіть найменша реєстрація вимагає їхньої активності.

У сьогоднішньому посібнику ми займемося розробкою простої системи реєстрації, за допомогою якої вам не знадобляться жодні паролі! У результати ми отримаємо систему, яку можна буде легко змінити або вбудувати в існуючий PHP-сайт. Якщо вам цікаво, читайте далі.

PHP

Тепер ми готові зайнятися кодом PHP. Основний функціонал системи реєстрації надається класом User, який ви можете побачити нижче. Клас використовує (), що є мінімалістською бібліотекою для роботи з базами даних. Клас User відповідає за доступ до баз даних, генерування token-ів для логіну та їх валідації. Він представляє нам простий інтерфейс, який можна легко включити в систему реєстрації на ваших сайтах, заснованих на PHP.

User.class.php

// Private ORM instance
private $orm;

/**
* Find a user by a token string. Тільки valid tokens are taken into
* consideration. A token is valid for 10 minutes after it has been generated.
* @param string $token The token to search for
* @return User
*/

Public static function findByToken($token)(

// Find it in the database and make sure the timestamp is correct


->where("token", $token)
->where_raw("token_validity > NOW()")
->find_one();

If(!$result)(
return false;
}

Return new User($result);
}

/**
* Either login або register a user.
* @return User
*/

Public static function loginOrRegister($email)(

// If such a user already exists, return it

If(User::exists($email))(
return new User($email);
}

// Otherwise, create it and return it

Return User::create($email);
}

/**
* Create a new user and save it to the database
* @param string $email The user"s email address
* @return User
*/

Private static function create($email)(

// Write a new user to the database and return it

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

Return new User($result);
}

/**
* Check whether such a user exists in the database and return a boolean.
* @param string $email The user"s email address
* @return boolean
*/

Public static function exists($email)(

// Does the user exist in the database?
$result = ORM::for_table("reg_users")
->where("email", $email)
-> count ();

Return $result == 1;
}

/**
* Create a new user object
* @param $param ORM instance, id, email або null
* @return User
*/

Public function __construct($param = null)(

If($param instanceof ORM)(

// An ORM instance was passed
$this->orm = $param;
}
else if(is_string($param))(

// An email was passed
$this->
->where("email", $param)
->find_one();
}
else(

If(is_numeric($param))(
// A user id was passed as a parameter
$id = $param;
}
else if(isset($_SESSION["loginid"]))(

// No user ID був passed, look into the sesion
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->where("id", $id)
->find_one();
}

/**
* Generates a new SHA1 login token, writes it to database and returns it.
* @return string
*/

Public function generateToken()(
// generate a token for the logged in user. Save it to the database.

$token = sha1($this->email.time().rand(0, 1000000));

// Save the token to the database,
// and mark it as valid for the next 10 minutes only

$this->orm->set("token", $token);
$this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")");
$this->orm->save();

Return $token;
}

/**
* Login this user
* @return void
*/

Public function login()(

// Mark the user as logged in
$_SESSION["loginid"] = $this->orm->id;

// Update the last_login db field
$this->orm->set_expr("last_login", "NOW()");
$this->orm->save();
}

/**
* Destroy the session and logout the user.
* @return void
*/

Public function logout()(
$_SESSION = array();
unset($_SESSION);
}

/**
* Check whether the user is logged in.
* @return boolean
*/

Public function loggedIn()(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Check whether the user is an administrator
* @return boolean
*/

Public function isAdmin()(
return $this->rank() == "administrator";
}

/**
* Find the type of user. It can be either admin або regular.
* @return string
*/

Public function rank()(
if($this->orm->rank == 1)(
return "administrator";
}

Return "regular";
}

/**
* Magic method for accessing the elements of the private
* $orm instance as properties of the user object
* @param string $key Accessed property"s name
* @return mixed
*/

Public function __get($key)(
if(isset($this->orm->$key))(
return $this->orm->$key;
}

Return null;
}
}
Token-и генеруються за допомогою алгоритму і зберігаються в базу даних. Ми використовуємо з MySQL для встановлення значення в колонку token_validity, що дорівнює 10 хвилин. При валідації token, ми повідомляємо движку, що нам потрібен token, поле token_validity поки що не закінчилося. Таким чином ми обмежуємо час, протягом якого token буде валідним.

Зверніть увагу, що ми використовуємо чарівний метод __get () в кінці документа, щоб отримати доступ до властивостей об'єкта user. Це дозволяє нам здійснити доступ до даних, які зберігаються у базі даних як властивостей: $user->email, $user->token. Для прикладу давайте подивимося, як ми можемо використовувати цей клас у наступному фрагменті коду:


Ще один файл, в якому зберігається потрібний функціонал, це functions.php. Там у нас є кілька допоміжних функцій, які дозволяють нам зберегти інший код більш охайним.

Functions.php

Function send_email($from, $to, $subject, $message)(

// Helper function for sending 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()(

// Find out the URL of a PHP file

$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)(

// Номер login attempts for last hour by this IP address

$count_hour = ORM::for_table("reg_login_attempt")
->
->where_raw("ts> SUBTIME(NOW(),"1:00")")
-> count ();

// Номер login attempts for last 10 minutes by this IP address

$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)(

// Create a new record in the login attempt table

$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

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

// Output a JSON header

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

// Is the email address valid?

If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(
throw new Exception("Please enter a valid email.");
}

// Це буде запропонувати, якщо людина не з'явиться
// Застосування логотипів на терміни (see functions.php for more):
rate_limit($_SERVER["REMOTE_ADDR"]);

// Record this login attempt
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["email"]);

// Send the message to the user

$message = "";
$email = $_POST["email"];
$subject = "Your Login Link";

If(!User::exists($email))(
$subject = "Thank You For Registering!";
$message = "Якщо ви зареєструєтеся на нашому сайті!\n\n";
}

// Attempt to login or register the person
$user = User::loginOrRegister($_POST["email"]);

$message.= "Ви можете підписатися з цієї URL:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Отправляється expire автоматично після 10 хвилин.";

$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()
)));
}
При успішній авторизації або реєстрації, наведений вище код відсилає email людині з посиланням для авторизації. Token (лексема) стає доступною як $_GET-змінною "tkn" через згенеровану URL.

index.php

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

// Is this a valid login token?
$user = User::findByToken($_GET["tkn"]);

// Yes! Підключити користувача і переглянути сторінку.

$user->login();
redirect("protected.php");
}

// Invalid token. Redirect back to the login form.
redirect("index.php");
}
Запуск $user->login() створить необхідні змінні для сесії, що дозволить користувачеві залишатися авторизованим під час наступних входів.

Вихід із системи реалізується приблизно так само:

Index.php

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

$user = новий User();

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

Redirect("index.php");
}
Наприкінці коду ми знову перенаправляємо користувача на index.php, тому параметр logout = 1 в URL виключається.

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

Index.php

$user = новий User();

if($user->loggedIn())(
redirect("protected.php");
}
Нарешті, давайте подивимося, як можна захистити сторінку вашого сайту, і зробити її доступною лише після авторизації:

protected.php

// Щоб захистити будь-яку php page on your site, include main.php
// and create a new User object. It's that simple!

require_once "includes/main.php";

$user = новий User();

if(!$user->loggedIn())(
redirect("index.php");
}
Після цієї перевірки ви можете бути впевнені, що користувач успішно авторизувався. У вас також буде доступ до даних, які зберігаються в базі даних як властивості об'єкта $user. Щоб вивести email користувача та їх ранг, скористайтеся наступним кодом:

Echo "Your email: ".$user->email;
echo "Your rank: ".$user->rank();
Тут rank() – це метод, оскільки колонка rank у базі даних зазвичай містить числа (0 для звичайних користувачів та 1 для адміністраторів), і нам потрібно перетворити це все на назви рангів, що реалізується за допомогою даного методу. Щоб перетворити звичайного користувача на адміністратора, просто відредагуйте запис про користувача в phpmyadmin (або в будь-якій іншій програмі роботи з базами даних). Як адміністратор, користувач не буде наділений якимись особливими можливостями. Ви самі маєте право вибирати, яким правом наділяти адміністраторів.

Готово!

На цьому наша просте система реєстрації готова! Ви можете використовувати її на вже існуючому PHP-сайті або модернізувати її, дотримуючись власних вимог.

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

Найбільший реєстратор та хостинг-провайдер у Росії.

Понад 2 мільйони доменних імен на обслуговуванні.

Просування, пошта для домену, рішення для бізнесу.

Понад 700 тис. клієнтів у всьому світі вже зробили свій вибір.

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

Назад вперед

Створення простої системи реєстрації користувачів на PHP та MySQL

Створення системи реєстрації – це велика робота. Вам доводиться писати код, який здійснює валідацію email-адрес, відправляє повідомлення на пошту з підтвердженням реєстрації, а також здійснює валідацію решти полів форми та багато ще всього.

І навіть після того, як ви все це напишіть, користувачі будуть реєструватися неохоче, т.к. це вимагає певних зусиль з боку.

У цьому уроці ми створимо дуже просту систему реєстрації, яка не вимагає і не зберігає паролів взагалі! Результат буде легко змінювати та додати до вже існуючого PHP-сайту. Бажаєте з'ясувати, як це працює? Читайте нижче.



Ось як наша супер проста система працюватиме:

Ми скомбінуємо форму авторизації та реєстрацію. У цій формі буде поле для введення email-адреси та кнопка реєстрації;
- При заповненні поля email-адресою, після натискання на кнопку реєстрації буде створено запис про нового користувача, але тільки в тому випадку, якщо введена email-адреса не була знайдена в базі даних.

Після цього створюється випадковий унікальний набір символів (токен), який відправляється на вказану користувачем пошту у вигляді посилання, яка буде актуальна протягом 10 хвилин;
– За посиланням користувач переходить на наш сайт. Система визначає наявність токена та авторизує користувача;

Переваги такого підходу:

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

Недоліки:

Безпека облікового запису користувача. Якщо хтось має доступ до пошти користувача, він може авторизуватись.
- Email не захищений і може бути перехоплений. Майте на увазі, що це питання є актуальним і у випадку, коли пароль був забутий і його необхідно відновити, або в будь-якій системі авторизації, яка не використовує HTTPS для передачі даних (логін/пароль);
- Поки ви налаштуєте як потрібно поштовий сервер, існує шанс, що повідомлення з посиланнями на авторизацію потраплятимуть до спаму;

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

Тож використовувати її пропонується для реєстрацій на форумах та сервісах, які не працюють із важливою інформацією.

Як користуватись цією системою

У випадку, коли вам потрібно просто використовувати систему для авторизації користувачів на вашому сайті, і вам не хочеться розбирати цей урок по кісточках, ось що вам потрібно зробити:

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

Require_once "includes/main.php"; $user = новий User(); if(!$user->loggedIn())( redirect("index.php"); )
– Готово!

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

Перший крок – написання HTM-коду форми авторизації. Цей код розміщується у файлі index.php. Цей файл також містить PHP-код, який обробляє дані форми та інші корисні функції системи авторизації. Дізнатися про це можна у розділі нижче, присвяченому огляду PHP коду.

index.php

Tutorial: Super Simple Registration System з PHP & MySQL Login or Register

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

Login / Register

У головній секції (між тегами та ) я підключив основні стилі (у цьому уроці вони не розуміються, тому ви можете подивитися їх самі. Папка 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"))) ; var e-mail = form.find("input").val(), messageHolder = form.find("span"); (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder). text(m.message); )));) $(document). 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. ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) return new User($result) ; Авторизувати або зареєструвати користувача * @param string $email. if(User::exists($email))( return new User($email); ) // Інакше створити нового користувача в базі і повернути значення функції User::create від вказаного email return User::create($email );

Токени генеруються за допомогою алгоритму 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"; ); ) 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; :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"); кількість спроб входу $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->save(); ) function redirect($url)( header("Location: $url"); exit; ) Функції rate_limit і rate_limit_tick

стежать за кількістю спроб авторизації за період часу, що минув, з моменту першої спроби. Спроба входу записується в базі стовпця reg_login_attempt. Ці функції викликаються коли відбувається обробка та відправлення даних форми, як ви можете бачити з наступного фрагмента коду.

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"]); _POST["email"]); // Надіслати листа користувачу $message = ""; )( $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.= "Отправляється expire автоматично після 10 хвилин.";$result = send_email($fromEmail, $_POST["email"], $subject, $message);

index.php

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 на вашу коробку. )));

Після успішної авторизації/реєстрації код вище надішле користувачеві посилання для авторизації. Токен стає доступним, т.к. він передається як змінна в генерованому засланні методом

$_GET

з маркером tkn

index.php

If(isset($_GET["tkn"]))( // Чи є цей токен валідним для авторизації? $user = User::findByToken($_GET["tkn"]); if($user)( // Так , є. Здійснити редирект на захищену сторінку $user->login(); "); )

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

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

index.php

$user = новий User(); if($user->loggedIn())( redirect("protected.php"); )

Нарешті, ось шмат коду, що дозволяє захистити сторінки вашого сайту і зробити її доступною тільки після авторизації.

protected.php

// Щоб захистити кожну сторінку на вашому сайті, підключіть до неї файл // main.php і створіть новий об'єкт User. Ось як це просто! require_once "includes/main.php"; $user = новий 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 з нуля з використанням ООП:
Сподобався матеріал і хочете віддячити?




Нове на сайті

>

Найпопулярніше