ProfiPHPProfiPHP
Категория: Полезное в PHP

Система авторизации пользователей

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

Например, если авторизация основана на проверке уникального значения в Cookie, которое являет собой шифрованный алгоритмом md5 логина и пароля:
if ( isset( $_COOKIE['security'] ) && md5( $login.$password ) = strval( $_COOKIE['security'] ) ) {
// Выполняем необходимые операции
}
В данном случае нет контроля авторизации. Если кто то узнает значение cookie, он сможет очень легко зайти под данным аккаунтом. И никто никогда не узнает об удачной попытке взлома. Более того, если пользователь авторизовался, например, в компьютерном клубе, и забыл выйти из аккаунта, тогда единственным способом для выхода будет изменение логина или пароля на другом компьютере, чтобы значение cookie изменились.

Чтобы создать систему авторизации, необходимо сначала проанализировать другие сайты, например vk.com. Не нужно создавать велосипед, когда уже другие разработчики давным давно все сделали. Сейчас разберем систему авторизации по аналогии vk.com.

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

И так, для начала нам необходимо создать таблицу со следующими полями:
CREATE TABLE authorization_hash (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL DEFAULT '0',
`user_hash` varchar(32) NOT NULL DEFAULT '',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`status` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
Опишем основные поля:

ID – Уникальный идентификатор.

User_id – ID пользователя.

User_hash – 32 символьное уникальное значение (md5), по которому будет осуществляться проверка.

Date – Дата авторизации.

Status – Статус авторизации.

Как видно из таблицы, с данным подходом можно реализовать отдельные авторизации пользователей на разных компьютерах, что очень удобно. Кроме того, поле Status, которое может содержать значение 0 или 1, конкретно характеризует каждое подключение. Если 1 — значить пользователь авторизован, если 0 — вышел из аккаунта. Из этого выплывает очень замечательное решение: пользователь может сразу выйти из всех аккаунтов, где был авторизован. Если рассматривать пример с компьютерным клубом, для выхода из аккаунта необходимо просто удалить все сессии, а именно изменить параметр Status на 0.

Теперь разберем, как проходит авторизация. Данные примеры только показывают суть работы и не являют собой готовый программный код.
// Создаем кэш:
$user_hash = md5( $date );
// Добавлем в таблицу значение кэша:
INSERT INTO `authorization_hash` ( `user_id`, `user_hash`, `date`, `status` ) VALUES ( '{$user_id}', '{$user_hash}', '{$date}', '1' )
// Записываем значения в куки:
setcookie( 'user_id', $user_id, 365 );
setcookie( 'security', $user_hash, 365 );
Создать строку для алгоритма шифрования md5 можно многими способами, например "..................."

Проверка авторизации происходит так:
"SELECT `id` FROM `authorization_hash` WHERE ( `user_id` = '{$user_id}' AND `user_hash` = '{$security}' AND `status` = '1' ) LIMIT 0,1" );
if ( mysqli_num_rows( $link ) ) {
// Операции над авторизованным пользователем
}
Для удаления всех сессий кроме текущей, необходимо выполнить следующий запрос:
"UPDATE `authorization_hash` SET `status` = '0' WHERE ( `user_id` = '{$user_id}' AND `user_hash` != '{$security}' )" );

Добавить комментарий

Имя:
Текст комментария: