Другие разделы

Правила

FAQ

Пользователи

Комментарии

Друзья сайта

Flash Loops

RaceBook

Безопасная аутентификация пользователей с помощью PHP, MySQL, Cookie

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

В этой статье будет написано каким образом проводить безопасную аутентификацию пользователей на сайте с помощью языка PHP, баз данных и cookie (печенек).

Начнём с описания, на словах, самого алгоритма аутентификации пользователей.

Внимание!!! Данная статья осталась для истории, поэтому не стоит использовать данный алгоритм на своих сайтах.

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

И так, вот сам алгоритм:

  1. Логин и пароль, введённые пользователем, передаются на сервер;
  2. С помощью специального алгоритма происходит хэширование пароля;
  3. Хэш переданного пароля сверяется с хэшем пароля в БД;
  4. Генерируется новый хэш на основе данных браузера и пароля, этот хэш добавляется в запись БД пользователя;
  5. При следующих переходах пользователя по страничкам сайта будет сверяться логин, хэш пароля и неизвестный никому хэш, который создаётся динамически на сервере и сверяется с хэшом в БД.

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

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

Теперь перейдём к реализации данного алгоритма, он будет немного упрощён, чтобы он получился не большим. Если кому-то понравилась идея, то допишите необходимое сами :)

В БД нам понадобится 4 обязательных поля - это идентификатор, логин, пароль (хэш) и неизвестный хэш. Структура:

  1. CREATE TABLE `users` (
  2.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `login` VARCHAR(20) NOT NULL,
  4.   `password` VARCHAR(32) NOT NULL,
  5.   `hash` VARCHAR(32) NOT NULL,
  6.   PRIMARY KEY (`id`)
  7. );

Заметьте, что длина пароля и хэша в БД у нас равна 32, ибо хэш у алгоритма md5 получается именно такой длины.

HTML форма входа:

  1. <form action="./index.php" method="post">
  2. <p>Логин:</p>
  3. <input type="text" name="login" maxlength="15">
  4. <p>Пароль:</p>
  5. <input type="password" name="pass" maxlength="20">
  6. <input type="submit" name="enter" value="Войти"></form>

А вот собственно сам алгоритм аутентификации:

  1. if(isset($_POST['enter'])){ //если нажали кнопку входа, то идём дальше
  2.   $sql=mysql_query("SELECT `id`,`login`,`password` FROM users where `login`='".$_POST['login']."' LIMIT 1"); //формирование запроса в БД с ведённым логином
  3.   $user_row=mysql_fetch_array($sql);
  4.   unset($sql);
  5.   $check_pass=md5($_POST['pass'].md5($_POST['pass'].$user_row['login']).$user_row['id']); //примерный алгоритм хэширования пароля, можно сделать что нибудь проще или сложнее
  6.   if($check_pass==$user_row['password']){
  7.     setcookie('login',$user_row['login']); //прописываем в куки логин
  8.     setcookie('hash',$user_row['password']); // прописываем в куки хэш пароля
  9.   }
  10.   $check_pass=md5(($_SERVER['HTTP_ACCEPT_LANGUAGE']).$check_pass.$_SERVER['HTTP_USER_AGENT']); //примерный алгоритм генерации неизвестного хэша
  11.   mysql_query("UPDATE users SET `hash`='".$check_pass."' where `id`='".$user_row['id']."'"); //добавление неизвестного ни кому хэша в запись БД пользователя
  12.   unset($check_pass,$user_row);
  13. }
  14. else if(isset($_COOKIE['login']) && isset($_COOKIE['hash'])){ //если есть определённые куки, то начинаем их проверять
  15.   $sql=mysql_query("SELECT `id`,`login`,`password`,`hash` FROM users where `login`='".$_COOKIE['login']."' LIMIT 1"); //опять формуруем запрос для определённого логина в куках
  16.   $user_row=mysql_fetch_array($sql);
  17.   unset($sql);
  18.   $check_user=md5(($_SERVER['HTTP_ACCEPT_LANGUAGE']).$_COOKIE['hash'].$_SERVER['HTTP_USER_AGENT']); //генерация неизвестного ни кому хэша
  19.   if($_COOKIE['hash']!=$user_row['password'] || $check_user!=$user_row['hash']){ //сравнение хэша пароля в куках и БД, а также сравнение неизвестного хэша, который был сгенерирован и неизвестного хэша в БД, если проверка не прошла, то удаляем куки
  20.     setcookie('login','');
  21.     setcookie('hash','');
  22.   }
  23.   unset($user_row,$check_user);
  24. }

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

Обсудить на форуме

© Филимошин В. Ю., 2011

Комментарии

В конце статьи написано, что можно ещё кучу всякие проверок сделать...
Можно без проблем "урезать" переданную информацию с форм.

14:26:41 | 01/05/2012

А переданные с формы данные сразу в sql запрос пускаете? Надо от инъекций защищать...

17:40:43 | 28/04/2012

Можно попробовать...

10:04:37 | 29/03/2012

Вход

Логин:

Зарегистрировать

Пароль:

Забыли пароль?

запомнить

Пятнашки

1
4
2
5
13
12
9
3
7
6
11
8
14
10
15

Опрос

Как Вы узнали об этом сайте?

От админа (1036)

48.2%

От друзей (33)

1.53%

Поисковик выдал... (991)

46.1%

Увидел(а) на других сайтах (46)

2.14%

Другое (41)

1.90%

Случайное фото

Карагайский Бор

Счётчики

Яндекс.Метрика

Internet Map

Каталог@Mail.ru - каталог ресурсов интернет