PHP Login Form

Простая аутентификация на PHP

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

Disclaimer: статья рассчитана на совершенных новичков. Умудрённые опытом разработчики ничего нового здесь не найдут, но могут указать на возможные недочёты =).

Для написания системы аутентификации будем использовать базу данных MySQL/MariaDB, PHP, PDO, функции для работы с паролями, для построения интерфейса возьмём bootstrap.

Для начала создадим базу. Пусть она называется php-auth-demo. В новой базе создадим таблицу пользователей users :

CREATE TABLE `users` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `username` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

Создадим конфиг с данными для подключения к базе.

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

 'php-auth-demo', 'db_host' => '127.0.0.1', 'db_user' => 'mysql', 'db_pass' => 'mysql', ];

И сделаем «загрузочный» файл, который будем подключать вначале всех остальных файлов.

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

В «загрузочном» файле мы будем инициализировать сессию и объявим некоторые функции-помощники.

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); > return $pdo; >

Функция pdo() даст нам доступ к объекту PDO в любом месте нашего кода.

Далее нам нужна форма регистрации. Разместим её прямо в файле index.php .

 

Здесь всё просто: два поля, кнопка и форма, отправляющая запрос на файл do_register.php методом POST. Процесс регистрации пользователя опишем в файле do_register.php .

prepare("SELECT * FROM `users` WHERE `username` = :username"); $stmt->execute(['username' => $_POST['username']]); if ($stmt->rowCount() > 0) < flash('Это имя пользователя уже занято.'); header('Location: /'); // Возврат на форму регистрации die; // Остановка выполнения скрипта >// Добавим пользователя в базу $stmt = pdo()->prepare("INSERT INTO `users` (`username`, `password`) VALUES (:username, :password)"); $stmt->execute([ 'username' => $_POST['username'], 'password' => password_hash($_POST['password'], PASSWORD_DEFAULT), ]); header('Location: login.php');

В самом начале подключим наш «загрузчик».

Потом проверим, не занято ли имя пользователя. Для этого сделаем выборку из таблицы указав в условии полученное из формы имя пользователя. Обратите внимание, для запросов здесь и далее мы будем использовать подготовленные запросы, что обезопасит нас от SQL-инъекций. Для этого в тексте SQL-запроса мы указываем специальные плейсхолдеры, а при выполнении ассоциируем с ними ненадёжные данные (ненадёжными данными следует считать всё, что приходит из вне – $_GET, $_POST, $_REQUEST, $_COOKIE). После выполнения запроса мы просто проверим количество возвращённых строк. Если их больше нуля, то имя пользователя уже занято. В этом случае мы выведем сообщение и вернём пользователя на форму регистрации.

Читайте также:  How to Store values in session in php

Я написал «больше нуля», но по факту, из-за того, что поле username в таблице уникальное, rowCount() может нам вернуть лишь два возможных значения: 0 и 1 .

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

function flash(?string $message = null) < if ($message) < $_SESSION['flash'] = $message; >else < if (!empty($_SESSION['flash'])) < ?>  unset($_SESSION['flash']); > >

А также вызовем её нa форме регистрации, для вывода возможных сообщений.

На данном этапе простейший функционал регистрации нового пользователя готов.

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

Login

Register

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

prepare("SELECT * FROM `users` WHERE `username` = :username"); $stmt->execute(['username' => $_POST['username']]); if (!$stmt->rowCount()) < flash('Пользователь с такими данными не зарегистрирован'); header('Location: login.php'); die; >$user = $stmt->fetch(PDO::FETCH_ASSOC); // проверяем пароль if (password_verify($_POST['password'], $user['password'])) < // Проверяем, не нужно ли использовать более новый алгоритм // или другую алгоритмическую стоимость // Например, если вы поменяете опции хеширования if (password_needs_rehash($user['password'], PASSWORD_DEFAULT)) < $newHash = password_hash($_POST['password'], PASSWORD_DEFAULT); $stmt = pdo()->prepare('UPDATE `users` SET `password` = :password WHERE `username` = :username'); $stmt->execute([ 'username' => $_POST['username'], 'password' => $newHash, ]); > $_SESSION['user_id'] = $user['id']; header('Location: /'); die; > flash('Пароль неверен'); header('Location: login.php');

Здесь есть важный момент. Мы не запрашиваем пользователя из таблицы по паре username/password, а используем только username. Дело в том, что даже если вы захешируете пришедший из формы логина пароль и попробуете сравнить новый хеш с сохранённым в базе, вы ничего не получите. Password_hash() использует автоматически генерируемую соль для паролей и хеши будут всегда получаться разные. Вот результат функции password_hash , вызванной несколько раз для пароля «123»:

$2y$10$loqucup11.3DL1fgDWanoettFpFJuFFd0fY6BZyiP698ZqvA4tmuy $2y$10$.LF3OzmQRtJvuZZWeWF.2u80x3ls6OEAU5J9gLHDtcYrFzJkRRPvq $2y$10$iGj/nOCavShd2vbMZTC4GOMYCqDj2YSc8qWoeqjVbD1xaKU2CgAfi

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

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

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

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

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

prepare("SELECT * FROM `users` WHERE `id` = :id"); $stmt->execute(['id' => $_SESSION['user_id']]); $user = $stmt->fetch(PDO::FETCH_ASSOC); > ?> 

Welcome back, !

else < ?>

Registration

?>

А также закрыть доступ к форме логина, если пользователь уже вошёл:

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

Заключение

  • Используем PDO/MySQLi и подготовленные запросы для работы с базой данных.
  • В базе данных обязательно храним только хеш пароля.
  • Для хеширования пароля используем специальную функцию password_hash.
  • Для проверки пароля не делаем сравнение хешей, а используем специальную функцию password_verify.

Полный код примера доступен на гитхабе: ссылка на Github.

Источник

Simple Login Form in PHP and MySQL

In this tutorial, you will get free source code to create a simple login form in PHP and MySQL. It is developed with complete validation. It will be very useful to develop the best login system. So, you can easily integrate it into your projects.

The login form is an integral part of a web application. It is used to access individual information from the websites. Many popular websites Such as Facebook, Gmail, LinkedIn, Twitter & more have login features. Even you can use it to create an admin login panel for managing the front-end content dynamically.

Simple login Form in PHP

How to create a Simple Login Form Using PHP

The login form is created with two required fields like email & password. These fields have a backend validation to accept only valid& registered email address & password

  • Using PHP, It can send login data through the POST method.
  • Using MySQL, It can check registered users.
  • The login form does not allow invalid data and protects from the hacking
  • Login can convert illegal user input into legal input data.
  • You can’t get into the dashboard until you will not log in with valid credentials.
  • You can log out after login.

Before creating a login form in your project, you must have to create a signup/registration form. Because users can’t log in without signup/ register. If you don’t know to create a registration form, then there is no need to worry, you can also learn it on this website by clicking the following link.

Folder Structure

You should create the following folder structure. Otherwise, you can use the given login script directly in your project.

login-system/ |__database.php |__login-form.php |__login-script.php |__dashboard.php |__logout.php |__style.css

1. Connect PHP login Script to MySQL Database

First of all, write the following MySQL database connection script to connect PHP login System with Database.

connect_error) < die("Unable to Connect database: " . $conn->connect_error); > ?>

2. Create Login Form Using HTML

Now, configure the following steps to create a login form using HTML

  • Include login-script.php using the following script. Don’t worry it will explain it in the next step.
  • Include external style.css
  • Also, include the following bootstrap4 libraries to create a responsive login form.
  • Write the HTML code to create a login form

         .registration-form < background: #f7f7f7; padding: 20px; border: 1px solid orange; margin: 50px 0px; >.err-msg < color:red; >.registration-form form  

PHP Login Form

<?php echo $login; ?>

?>

?>

4. Create a Login Script Using PHP and MySQL

Before writing a login script, you should understand the following points.

  • Include database connection file using require_once(‘database.php’) .
  • Assign a connection variable $conn to a new variable $db .
  • Check registration data are set using isset($_POST[‘submit’]) , if these are set then validate email & password using legal_input() function.
  • If both email & password are validated successfully, call a custom function login() to process to login by checking valid credentials
  • If given credentials are already registered, it will redirect to the dashboard page.

File Name – login-script.php

)+$/"; //Email Address Validation if(empty($email)) < $emailErr="Email is Required"; >else if (!preg_match($validEmail,$email)) < $emailErr="Invalid Email Address"; >else < $emailErr=true; >// password validation if(empty($password)) < $passErr="Password is Required"; >else < $passErr=true; >// check all fields are valid or not if( $emailErr==1 && $passErr==1) < //legal input values $email= legal_input($email); $password= legal_input(md5($password)); // call login function $login=login($email,$password); >> // convert illegal input value to ligal value formate function legal_input($value) < $value = trim($value); $value = stripslashes($value); $value = htmlspecialchars($value); return $value; >// function to insert user data into database table function login($email,$password)< global $db; // checking valid email $sql="SELECT email FROM users WHERE email= ?"; $query = $db->prepare($sql); $query->bind_param('s',$email); $query->execute(); $exec=$query->get_result(); if($exec) < if($exec->num_rows>0)< // checking email and password $loginSql="SELECT email, password FROM users WHERE email=? AND password=?"; $loginQuery = $db->prepare($loginSql); $loginQuery->bind_param('ss',$email, $password); $loginQuery->execute(); $execQuery=$loginQuery->get_result(); if($execQuery) < if($execQuery->num_rows>0)< session_start(); $_SESSION['email']=$email; header("location:dashboard.php"); >else < return "Your Password is wrong"; >>else< return $db->error; > > else < return $email." is not registered"; >>else< return $db->error; > > ?>

5. Create Dashboard Using HTML and PHP

  • To create a dashboard, you have to do the following things –
  • Start session using session_start()
  • Assign session login email $_SESSION[’email’] to a new variable $email_address
  • If the session login email is empty, it will redirect to the login form page. means that you can’t directly open the dashboard page without login.
 ?>      

Welcome to Dashboard Logout

Your Email Address

6. Create Logout Script Using PHP

You can quickly log out by writing the following few lines of PHP code.

  • First of all, start the session using session_start()
  • Destroy session using session_destroy()
  • Redirect to the login page after logout.

My Suggestion

Dear Developers, I hope you have learned to create a simple login form using PHP. If you have any doubts or questions related to this tutorial, you can ask me through the below comment box. I will reply as soon as possible.

Thanks For giving time to this tutorial…

Hey there, Welcome to CodingStatus. My Name is Md Nurullah from Bihar, India. I’m a Software Engineer. I have been working in the Web Technology field for 4 years. Here, I blog about Web Development & Designing. Even I help developers to build the best Web Applications.

Primary Sidebar

Latest Tutorials

Categories

Copyright © 2023 CodingStatus — All Rights Reserved

Источник

Оцените статью