it-blog.club
Как создать систему безопасной авторизации с помощью PHP и MySQL

Как создать систему безопасной авторизации с помощью PHP и MySQL

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

logos-php-mysql.png

Предварительно нам потребуется

Формы HTML для входа и регистрации

Страница указателя с кнопкой выхода после успешного входа

MySQL Query

Фрагмент кода PHP для успешного входа

Можете воспользоваться приведённым ниже запросом, чтобы создать таблицу users. Ну это в том случае если вы не используете phpMyAdmin.


CREATE TABLE IF NOT EXISTS `kv_users` ( `id` int(10) NOT NULL AUTO_INCREMENT, `full_name` varchar(100) NOT NULL, `email` varchar(100) NOT NULL, `username` varchar(100) NOT NULL, `password` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

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

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

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


require_once("../config.php");
global $db;
$db = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME);
if(!$db){
die( "Сорян, где-то точно допущен косяк. Попросите своего котика найти его.");
}

Регистрация

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


function register($full_name, $user, $pass, $emailId){
global $db;
$full_name = mysqli_real_escape_string($db, $full_name);
$username = mysqli_real_escape_string($db, $user);
$password = mysqli_real_escape_string($db, $pass);
$email = mysqli_real_escape_string($db, $emailId);
$wp_hasher = new PasswordHash(16, true);
$pass = $wp_hasher->HashPassword( trim( $password ) );

$sql = "INSERT INTO kv_users (full_name, email,password,username) VALUES ('".$full_name."', '".$email."', '".$pass."', '".$username."')";
$result = mysqli_query($db, $sql);
return mysqli_insert_id($db); }

PasswordHash - класс, который помогает создавать защищенный пароль с помощью введенного вами ключа. Давайте использовать его, и вы можете получить его, наконец, из загружаемого ниже.

Вход

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


function login($user, $pass){
global $db;
$username = mysqli_real_escape_string($db, $user);
$password = mysqli_real_escape_string($db, $pass);
$sql = "SELECT id, password FROM kv_users WHERE username='".$username."' LIMIT 1 ";
$result = mysqli_query($db, $sql);
$id = mysqli_fetch_row($result);
if($id){
$password_hashed = $id[1];
$wp_hasher = new PasswordHash(16, true);
if($wp_hasher->CheckPassword($password, $password_hashed)) {
return $id[0];
}
} else {
return false;
}
}

Также нам нужна функция выхода из системы.

Выход

Чтобы выйти из системы


function logout(){
unset($_SESSION['user_id']);
session_destroy();
header('Location: index.php');
exit();
}

Проверка имени пользователя

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


function usernameExist($user){
global $db;
$username = mysqli_real_escape_string($db, $user);
$sql = "SELECT id FROM kv_users WHERE username='".$username."' LIMIT 1 ";
$result = mysqli_query($db, $sql);
$id = mysqli_fetch_row($result);
return ($id[0] > 0);
}

Теперь давайте создадим форму для регистрации.

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


<form action="" method="post" >
<?php if(!empty($reg_errors)) {
echo '<div class="error">';
foreach ($register_errors as $error) {
echo '<p>'.$error.'</p>';
}
echo '</div>';
} ?>
<div class="group">
<input type="text" name="full_name" ><span class="highlight"></span><span class="bar"></span>
<label>Имя</label>
</div>
<div class="group">
<input type="email" name="email" ><span class="highlight"></span><span class="bar"></span>
<label>Email</label>
</div>
<div class="group">
<input type="text" name="username" ><span class="highlight"></span><span class="bar"></span>
<label>Ник</label>
</div>
<div class="group">
<input type="text" name="password" ><span class="highlight"></span><span class="bar"></span>
<label>Пароль</label>
</div>
<input type="hidden" name="register" value="yes" >
<button type="submit" class="buttonui "> <span> Регистрация </span>
<div class="ripples buttonRipples"><span class="ripplesCircle"></span></div>
</button>
<a class="buttonui " href="login.php?action=login" style="line-height:4em; text-decoration: none; padding:2%" >
<span> Вход </span>
<div class="ripples buttonRipples"><span class="ripplesCircle"></span></div>
</a>
</form>

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


$register_errors= $login_error = array();
if('POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['register'])) {
$fields = array( 'full_name', 'username', 'email', 'password' );
foreach ($fields as $field) {
if (isset($_POST[$field])) $posted[$field] = stripslashes(trim($_POST[$field]));
else
$posted[$field] = '';
}
if ($posted['full_name'] == null) array_push($register_errors, sprintf('<strong>Внимание</strong>: <span lang="ru">Введите полное имя пользователя</span>.', 'neem'));
if ($posted['email'] == null) array_push($register_errors, sprintf('<strong>Внимание</strong>: Введите ваш Email.', 'neem'));
if ($posted['password'] == null) array_push($register_errors, sprintf('<strong>Внимание</strong>: Введите пароль.', 'neem'));
if ($posted['username'] == null ) array_push($register_errors, sprintf('<strong>Внимание</strong>: Введите Ник.', 'neem'));
if(usernameExist($posted['username'])){
array_push($register_errors, sprintf('<strong>Внимание</strong>: Введённый Ник уже существует.', 'neem'));
}
$reg_errors = array_filter($register_errors);
if (empty($reg_errors)) {
register($posted['full_name'], $posted['username'], $posted['password'], $posted['email']);
}
}

Давайте создадим форму входа и ее php-код, чтобы обработать её.

Форма входа

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


<form action="" method="post" >
<?php if(!empty($log_error) || (isset($mismatchErr) && $mismatchErr != '')) {
echo '<div class="error">';
foreach ($login_error as $error) {
echo '<p>'.$error.'</p>';
}
echo $mismatchErr.'</div>';
} ?>
<div class="group">
<input type="text" class="used" name="username" ><span class="highlight"></span><span class="bar"></span>
<label>Ваш ник</label>
</div>
<div class="group">
<input type="password" name="password" ><span class="highlight"></span><span class="bar"></span>
<label>Пароль</label>
</div>
<input type="hidden" name="login" value="yes" >
<button type="submit" class="buttonui "> <span> Войти </span>
<div class="ripples buttonRipples"><span class="ripplesCircle"></span></div>
</button>
<a class="buttonui " href="login.php?action=register" style="line-height:4em; text-decoration: none; padding:2%" >
<span> Регистрация </span>
<div class="ripples buttonRipples"><span class="ripplesCircle"></span></div>
</a>
</form>

И ниже приведён php-код для обработки данных формы и проверки входа в систему.


if('POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['login'])) {
$username = stripslashes(trim($_POST['username']));
$password = stripslashes(trim($_POST['password']));
$mismatchErr = '';
if ($password == null ) array_push($login_error, sprintf('<strong>Внимание</strong>: Введите пароль.', 'neem'));
if ($username == null ) array_push($login_error, sprintf('<strong>Внимание</strong>: Введите Ник.', 'neem'));
$log_error = array_filter($login_error);
if (empty($log_error)) {
$loginn = login($username, $password);
if($loginn){
$_SESSION['user_id'] = $loginn;
header('Location: index.php');
exit();
}else {
$mismatchErr .= sprintf('<p> <strong>Внимание</strong>: Введите настоящие данные. </p>', 'neem');
}
}
}

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


it-blog.club 500
Автор: Ярослав Хмель


Если Вам понравилась статья, то можете поддержать блог переведя N сумму на кофе авторам или оплату хостинга!
В любом случае спасибо! А так же не забывайте про группу в ВК
ПОИСК ПО САЙТУ
Поддержать