Пишем авторизацию пользователя на PHP — Блог веб-разработчиков

Совсем недавно я рассказывал, как при помощи PHP написать систему регистрации для своего сайта. Такой же принцип мы использовали и в своём проекте, созданию которого посвящён раздел «Сайт с нуля» на этом блоге (сам проект я покажу вам гораздо позже). Сегодня же я опишу, как написать авторизацию на сайте, используя данные, полученные от пользователя при регистрации. То есть, будет использоваться таблица MySQL, структура которой была описана в статье про регистрацию. Поэтому я настоятельно рекомендую прежде прочитать ту статью, ибо данная статья является её непосредственным продолжением. Авторизация будет работать с использованием сессий и cookie. Также в статье будет рассмотрено несколько приятных дополнений, таких, как «разлогинивание» (выход) и время последней активности пользователя. Итак, приступим…

Для начала необходимо сверстать главную страницу сайта и поместить её в корне сайта в папку template. Для данного урока нам достаточно, чтобы в этом файле была форма ввода логина и пароля, а также кнопка «Вход». Далее приведён код этой формы:

1
2
3
4
5
<form action="/" method="post">
 Логин: <input type="text" name="login" />

 Пароль: <input type="password" name="password" />
 <input type="submit" value="Войти" name="log_in" />

 </form>

Файл назовём index.html.

Метод передачи post необходим. Ведь мы не хотим, чтобы при авторизации логин и пароль светились в адресной строке.

Как только форма готова, создадим самый важный файл будущего сайта — главный контроллер, т. е. файл, лежащий в корне сайта — index.php. Именно он и будет запускаться при входе на сайт. На момент написания статьи на нашем проекте код этого файла занимает 92 строки, нам же понадобится пока лишь около 25 строк. Вот его код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?
include ('lib/connect.php'); //подключаемся к БД
include ('lib/module_global.php'); //подключаем файл с глобальными функциями

 
if($_GET['action'] == "out") out(); //если передана переменная action, «разавторизируем» пользователя
 
if (login()) //вызываем функцию login, определяющую, авторизирован юзер или нет

{
	$UID = $_SESSION['id']; //если юзер авторизирован, присвоим переменной $UID его id
	$admin = is_admin($UID); //определяем, админ ли юзер

}
else //если пользователь не авторизирован, то проверим, была ли нажата кнопка входа на сайт
{
	if(isset($_POST['log_in'])) 
	{
		$error = enter(); //функция входа на сайт

		if (count($error) == 0) //если нет ошибок, авторизируем юзера
		{
			$UID = $_SESSION['id'];

			$admin = is_admin($UID);
		}
	}
}
include ('tpl/index.html'); //подключаем файл с формой

?>

Теперь более подробно разберёмся, как всё это работает.

В первых трёх строках мы просто подключаем файлы с функциями, которые будем использовать далее в коде. О них чуть позже. Далее проверим, был ли передан get-параметр action=out. Если он был передан, значит пользователь нажал на ссылку выхода с сайта. Вот, кстати, код этой ссылки. Добавьте его в файл с кодом формы для входа.

<a href="/?action=out">Выход</a>

Саму функцию, как и все остальные, рассмотрим позже. Сперва логика…

Далее идёт условие, проверяющее авторизирован ли ты (if (login())). Функция возвращает true в случае, если пользователь вошёл на сайт и false в противном случае. Если вернулось true, записываем в переменную $UID id юзера, а в переменную $admin — результат работы функции is_admin($UID). Данная функция определяет, является ли пользователь администратором и возвращает true, если юзер — админ и false в противном случае. В дальнейшем две эти переменные будут необходимы для вывода определённых элементов на странице. Так, следующим условием можно вывести форму авторизации:

1
2
3
4
5
6
7
8
9
10
<?
If($UID) //если переменной нет, выводим форму
{?>
<form action="/" method="post">

Логин: <input type="text" name="login" />
Пароль: <input type="password" name="password" />

<input type="submit" value="Войти" name="log_in" />
</form>
<?}
?>

Аналогично и с переменной $admin. Кстати, последний код можно включить в файл с формой.
Если же функция login() вернёт false, т. е. пользователь не вошёл на сайт, проверим, нажал ли он на кнопку входа на сайт в форме авторизации:

if(isset($_POST['log_in']))

Если да, запускаем функцию enter(), авторизирующую пользователя. Если ошибок не произойдёт и юзер успешно вошёл, создадим те же 2 переменные: $UID и $admin. В противном случае никакие переменные не создаются – пользователь является гостем. Алгоритм работы представлен на следующей схеме:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

function enter ()
 { 
$error = array(); //массив для ошибок 	
if ($_POST['login'] != "" && $_POST['password'] != "") //если поля заполнены 	

{ 		
	$login = $_POST['login']; 
	$password = $_POST['password'];

	$rez = mysql_query("SELECT * FROM users WHERE login=$login"); //запрашиваем строку из БД с логином, введённым пользователем 		
	if (mysql_num_rows($rez) == 1) //если нашлась одна строка, значит такой юзер существует в БД 		

	{ 			
		$row = mysql_fetch_assoc($rez); 			
		if (md5(md5($password).$row['salt']) == $row['password']) //сравниваем хэшированный пароль из БД с хэшированными паролем, введённым пользователем и солью (алгоритм хэширования описан в предыдущей статье) 						

		{ 
		//пишем логин и хэшированный пароль в cookie, также создаём переменную сессии
		setcookie ("login", $row['login'], time() + 50000); 						
		setcookie ("password", md5($row['login'].$row['password']), time() + 50000); 					
		$_SESSION['id'] = $row['id'];	//записываем в сессию id пользователя 				

		$id = $_SESSION['id']; 				
		lastAct($id); 				
		return $error; 			
	} 			
	else //если пароли не совпали 			

	{ 				
		$error[] = "Неверный пароль"; 										
		return $error; 			
	} 		
} 		
	else //если такого пользователя не найдено в БД 		

	{ 			
		$error[] = "Неверный логин и пароль"; 			
		return $error; 		
	} 	
} 	
 

	else 	
	{ 		
		$error[] = "Поля не должны быть пустыми!"; 				
		return $error; 	
	} 

}

Первым делом, функция проверяет, заполнил ли пользователь поля для ввода логина и пароля. Если да — продолжаем работу программы, если нет — пишем в массив $error текст ошибки и возвращаем его в основную программу, которая, узнав размерность полученного массива, не авторизирует пользователя.
Если же работа функции enter() продолжится, проверим, существует ли в БД запись с таким ником, какой ввёл юзер. Если такой записи не оказалось, вернём опять же массив с соответствующей ошибкой. Если в БД есть один пользователь с таким ником, сравним введённый пароль с паролем, хранящимся в базе данных и соответствующим нашему нику.

Сравниваем мы пароли не в чистом виде. Ведь в БД они хранятся хэшированными функцией md5(). Поэтому, прежде чем сравнивать их, необходимо тем же алгоритмом хэшировать и введённый пользователем при авторизации пароль. Если хэши совпадут, значит логин и пароль совпали и скрипт авторизирует пользователя. Если совпадения не произошло, вернём ошибку.

Теперь объясню, что же значит «авторизироваться». В данном скрипте данные об авторизации хранятся в сессии и cookie. В сессию записываем id пользователя:

И создаём два cookie: login и password с продолжительностью жизни — 50000 секунд. В первый пишем логин, а во второй — хэш пароля.

В этой строке мы выполняем функцию, отвечающую за установку времени последней активности юзера. Вот код этой функции:

1
2
function lastAct($id)
{ 	$tm = time(); 	mysql_query("UPDATE users SET online='$tm', last_act='$tm' WHERE"); }

Функция перезаписывает поля online и last_act в БД. Кстати, предварительно, необходимо убедиться в существовании этих полей. Оба они имеют тип int.

Алгоритм работы функции enter() приведён на следующей иллюстрации:

Следующая функция отвечает за проверку, авторизирован ли пользователь на сайте или нет — login().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function login () { 	
ini_set ("session.use_trans_sid", true); 	session_start();  	if (isset($_SESSION['id']))//если сесcия есть 	

{ 		
if(isset($_COOKIE['login']) && isset($_COOKIE['password'])) //если cookie есть, то просто обновим время их жизни и вернём true 		{ 			
SetCookie("login", "", time() - 1, '/'); 			SetCookie("password","", time() - 1, '/'); 			

setcookie ("login", $_COOKIE['login'], time() + 50000, '/'); 			

setcookie ("password", $_COOKIE['password'], time() + 50000, '/'); 			

$id = $_SESSION['id']; 			
lastAct($id); 			
return true; 		

} 		
else //иначе добавим cookie с логином и паролем, чтобы после перезапуска браузера сессия не слетала  		
{ 			
$rez = mysql_query("SELECT * FROM users WHEREid']}'"); //запрашиваем строку с искомым id 			

if (mysql_num_rows($rez) == 1) //если получена одна строка 			{ 		
$row = mysql_fetch_assoc($rez); //записываем её в ассоциативный массив 				

setcookie ("login", $row['login'], time()+50000, '/'); 				

setcookie ("password", md5($row['login'].$row['password']), time() + 50000, '/'); 

$id = $_SESSION['id'];
lastAct($id); 
return true; 			

} 
else return false; 		
} 	
} 	
else //если сессии нет, то проверим существование cookie. Если они существуют, то проверим их валидность по БД 	
{ 		
if(isset($_COOKIE['login']) && isset($_COOKIE['password'])) //если куки существуют. 		

{ 			
$rez = mysql_query("SELECT * FROM users WHERE login='{$_COOKIE['login']}'"); //запрашиваем строку с искомым логином и паролем 			
@$row = mysql_fetch_assoc($rez); 			

if(@mysql_num_rows($rez) == 1 && md5($row['login'].$row['password']) == $_COOKIE['password']) //если логин и пароль нашлись в БД 			

{ 				
$_SESSION['id'] = $row['id']; //записываем в сесиию id 				
$id = $_SESSION['id']; 				

lastAct($id); 				
return true; 			
} 			
else //если данные из cookie не подошли, то удаляем эти куки, ибо нахуй они такие нам не нужны 			
{ 				
SetCookie("login", "", time() - 360000, '/'); 				

SetCookie("password", "", time() - 360000, '/');	 				
return false; 			

} 		
} 		
else //если куки не существуют 		
{ 			
return false; 		
} 	
} 
}

Почему для авторизации мы будем использовать и COOKIE и сессию? Дело в том, что после закрытия браузера, сессия «умирает» и пользователь автоматически разлогинивается. Cookie же хранятся определённое, задаваемое нами, время. В данном случае это 50000 секунд.

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

Функция вернёт true, если юзер авторизирован и false в противном случае. Пичём, в процессе её работы, будет обновлено время жизни cookie, а также они будут созданы, если не существуют.

Лучше всего работу функции online описывает эта иллюстрация:

Если есть сессия и cookie, мы обновляем время жизни cookie. Для этого мы их удаляем, устанавливая время смерти на одну секунду раньше текущего момента времени, а затем устанавливаем заново. Также функцией lastAct() обновлем время последней активности. Возвращаем true.

Если же сессия есть, а cookie по какой-то причине не оказалось, то по id пользователя получаем из БД логин и хэш пароля и пишем их в cookie. Возвращаем true.

Если нет сессии, проверим, быть может существуют cookie. Классический пример авторизации после перезапуска браузера — сессия слетела, но cookie-то живы. Тут уже сложнее, мы должны проверить, совпадает ли пара логин-пароль с какой-либо строкой из БД. Ведь юзер мог заменить в настройках для сайта cookie ручками или написать любую чушь. Если такая пара нашлась, создаём переменную сессии и возвращаем true. Если же пара не найдена, посылаем пользователя на йух и возвращаем false.

Последний, самый печальный вариант — когда ни сессии, ни cookie не оказалось… Возвращаем false.

Теперь обратим взор на функцию is_admin($UID). Она определяет, является ли юзер администратором сайта. Возможно, вам это не нужно, тогда можете опустить эту функцию и все её вызовы в контроллере. Но она может быть полезна для вывода какого либо контента на страницу, предназначенного для администраторов, а не для обычных пользователей. Функция простая и основана на ещё одном созданном столбце в БД в таблице users. Столбец называем prava. Тип int. Если юзер является обыкновенным пользователем, то присваиваем значению в этом столбце 0, если же этот юзер — админ, то присваиваем единицу. Следующая функция и определяет, что стоит в столбце prava; если единица, то возвращается true (пользователь – админ), иначе false.

1
2
3
4
5
6
7
8
9
10
function is_admin($id) { 	
@$rez = mysql_query("SELECT prava FROM users WHERE"); 	

if (mysql_num_rows($rez) == 1) 	
{ 		
$prava = mysql_result($rez, 0); 		

if ($prava == 1) return true; 		
else return false; 

} 	
else return false;	 
}

Ну и последняя, на самом деле очень лёгкая, функция — out(). Принцип её работы прост — удалить все «следы» пользователя – сессию и cookie.

1
2
3
4
5
6
7
8
function out () { 	
session_start(); 	
$id = $_SESSION['id'];			 	

mysql_query("UPDATE users SET online=0 WHERE"); //обнуляем поле online, говорящее, что пользователь вышел с сайта (пригодится в будущем) 	
unset($_SESSION['id']); //удаляем переменную сессии 	
SetCookie("login", ""); //удаляем cookie с логином 	

SetCookie("password", ""); //удаляем cookie с паролем  	
header('Location: http://'.$_SERVER['HTTP_HOST'].'/'); //перенаправляем на главную страницу сайта }

Код всех описанных функций помещаем в файл lib/module_global.php, который подключается в самом начале работы контроллера.

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

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

Чтобы не пропустить следующие статьи, подпишитесь на RSS.

Удачи и до следующих статей.

true-coder.ru

Правильная php регистрация и авторизация

Опубликовано: 03.02.2015 13:08

Просмотров: 5024

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

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

PHP Регистрация

Здесь представлен код, который является только общим примером. Замечу, что для каждого сайта код наверняка нужно будет модифицировать. Я использую фреймворк Codeigniter, так что представленные функции типа $this->input->post() являются специфическими и легко заменяются на аналогичные (Если потребуется — опишу в комментариях, только дайте знать).

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//регистрация пользователя
    public function register() {   
        //передаём заголовок для верного распознавания кодировки
        header("Content-Type: text/html; charset=UTF-8");
        // методом post передаём данные со стороны клиента
        $name = $this->input->post('name');
        $secondname = $this->input->post('secondname');
        $surname = $this->input->post('surname');
        $userid = $this->input->post('userid');
        $pass = $this->input->post('pass');
        $email = $this->input->post('email');
        // Генерируем соль
        $salt = '$3h$al$' . substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22) . '$';
        // Шифруем пароль с применением данной соли
        $hashed_pass = crypt($pass, $salt);
        //выполняем запрос к базе данных
        $query_linked = $this->db->query("INSERT INTO `пользователи` (Логин, Пароль, Соль, Имя, Фамилия, E-Mail, ID_Роль) VALUES ('$userid','$hashed_pass','$salt','$name','$secondname','$email','1')");
        //выводим результат TRUE или FALSE
        echo $query_linked;
    }

В данном коде я:

  1. Передаю заголовок
  2. Получаю данные со стороны клиента
  3. Генерирую соль (это некая строка, с помощью которой мы кодируем наш пароль. В случае его воровства грабителям придётся ой как постараться, дабы подобрать пароль доступа). Запомните — Никогда не храните пароли в открытом виде!
  4. Далее с помощью функции crypt шифруем пароль
  5. Выполняем запрос, который вставит определённую запись в таблицу Пользователи. Вы можете переписать этот запрос под свою структуру БД.

PHP Авторизация

Следующий же код тоже очень прост в использовании. Смотрим и оцениваем.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

//авторизация пользователя
    public function login() {
        header("Content-Type: text/html; charset=UTF-8");
        $login = $this->input->post('login');
        $pass = $this->input->post('pass');
        // Генерируем соль
        $salt = '$3h$al$' . substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22) . '$';
        // Шифруем пароль с применением данной соли
        $hashed_pass = crypt($pass, $salt);
        $query_check_user = $this->db->query("SELECT пользователи.*,роли.название FROM (пользователи,роли) WHERE пользователи.Логин = " . $this->db->escape($login) . " and пользователи.Пароль = " . $this->db->escape($hashed_pass) . "  and пользователи.ID_Роль = роли.ID"); 
// Если кол-во строк в ответе больше 0         if ($query_check_user->num_rows() > 0) {
//представляем результат в виде массива             $query_check_user = $query_check_user->result_array();
//проходим по всем элементам массива             foreach ($query_check_user as $query_check_user1) {                 // Создаем массим с данными сессии                 $authdata = array(                     'username' => $login,                     'logged_in' => true,                     'familiya' => $query_check_user1['Фамилия'],                     'name' => $query_check_user1['Имя'],                     'name_role' => $query_check_user1['Название']                 );                 // Добавляем данные в сессию                 $this->session->set_userdata($authdata);                 $returnText = '1';             }         } else{             $returnText = '0';         }         echo $returnText;     }

В этой функции мы:

  1. Передаём заголовок (см. выше, если не понимаем)
  2. Получаем Логин и Пароль от клиентской стороны
  3. Генерируем соль
  4. Шифруем введённый пароль с солью
  5. Выбираем пользователей, которые подходят под полученные данные
  6. Если кол-во строк в ответе больше 0, то записываем данные в сессию. В противном случае возвращаем 0, т.е. Неудачу (Fail, FALSE и прочие названия).

Данный способ даёт неплохую защиту данных. Практически нереально будет подобрать пароль + даже при воровстве данных информацию не раскодировать, потому что функция crypt кодирует в одну сторону! Раскодировать невозможно!)))) Так что радуемся, репостим, оставляем отзывы и прочее.

Надеюсь, что статья была вам полезна. Жду ваших комментариев! (P.S. Те, кто найдёт самый большой минус в моём коде — получит 100 баллов на счёт! Поехали!)

 

Если статья была для Вас полезной — Поделитесь ссылкой!

Советуем почитать

Закрепленные

Понравившиеся

seo-love.ru

Пишем свою авторизацию на PHP и MySQL -Будни программиста

Ну что же, сегодня я вам расскажу о безопасной авторизации на PHP и Cookie. Ну о том что она абсолютна безопасна я не говорю, ибо взломать можно все, но для маленького сайта она вполне подходит. Так же я предвижу комментарии о том что сессии безопаснее. Не спорю куки уступают сессиям в безопасности но для реализации простенькой авторизации вполне подходят. Подробности ниже.

И так, в базе у нас будет 1 база из 4 полей: users_id, users_login, users_password и users_hash. SQL запрос:

1
2
3
4
5
6
7

CREATE TABLE IF NOT EXISTS `users` (
  `users_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `users_login` VARCHAR(30) NOT NULL,
  `users_password` VARCHAR(32) NOT NULL,
  `users_hash` VARCHAR(32) NOT NULL,
  PRIMARY KEY  (`users_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

    Сам скрипт авторизации будет тоже на 4 файлах. А именно:

  • conf.php — Файл конфигурации, в котором так же содержится подключение к бд;
  • register.php — Регистрация нового пользователя;
  • login.php — Авторизация пользователя;
  • check.php — Скрипт проверки авторизации;

Давайте разберем каждый файл.

conf.php

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

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

<?php
# настройки
define (‘DB_HOST’, ‘localhost’);
define (‘DB_LOGIN’, ‘example_user’);
define (‘DB_PASSWORD’, ‘example_password’);
define (‘DB_NAME’, ‘example_base’);
mysql_connect(DB_HOST, DB_LOGIN, DB_PASSWORD) or die («MySQL Error: » . mysql_error());
mysql_query(«set names utf8») or die («<br>Invalid query: » . mysql_error());
mysql_select_db(DB_NAME) or die («<br>Invalid query: » . mysql_error());

# массив ошибок
$error[0] = ‘Я вас не знаю’;
$error[1] = ‘Включи куки’;
$error[2] = ‘Тебе сюда нельзя’;
?>

register.php

Файл регистрации, тут содержится простейшая форма и ее обработчик. Исходный код прокомментирован, но общий процесс я коротко опишу. Вначале проверяем наш логин, он может содержать только английские буквы и цифры. Далее мы проверяем длину логина, от 3 до 30 символов. Проверяем свободен ли логин. При успешных проверках добавляем нового пользователя в базу. Из введенного пароля мы вырезаем пробелы на случай если пользователь хранит свои пароли в каком ни будь текстовом файле (в windows текстовые редакторы любят «хватать» пробелы в начале или конце выделяемого текста). Шифруем пароль в двойном MD5 и добавляем в базу данные о новом пользователе. Перебрасываем пользователя на login.php.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

<?php
# Подключаем конфиг
include ‘conf.php’;

if(isset($_POST[‘submit’]))
{

    $err = array();

    # проверям логин
   if(!preg_match(«/^[a-zA-Z0-9]+$/»,$_POST[‘login’]))
    {
        $err[] = «Логин может состоять только из букв английского алфавита и цифр»;
    }
     
    if(strlen($_POST[‘login’]) < 3 or strlen($_POST[‘login’]) > 30)
    {
        $err[] = «Логин должен быть не меньше 3-х символов и не больше 30»;
    }
     
    # проверяем, не сущестует ли пользователя с таким именем
  $query = mysql_query(«SELECT COUNT(users_id) FROM users WHERE users_login='».mysql_real_escape_string($_POST[‘login’]).»‘»)or die («<br>Invalid query: » . mysql_error());
    if(mysql_result($query, 0) > 0)
    {
        $err[] = «Пользователь с таким логином уже существует в базе данных»;
    }
 
     
    # Если нет ошибок, то добавляем в БД нового пользователя
   if(count($err) == 0)
    {
         
        $login = $_POST[‘login’];
         
        # Убераем лишние пробелы и делаем двойное шифрование
       $password = md5(md5(trim($_POST[‘password’])));
         
        mysql_query(«INSERT INTO users SET users_login='».$login.»‘, users_password='».$password.»‘»);
        header(«Location: login.php»); exit();
    }
}
?>

  <form method=»POST» action=»»>
  Логин <input type=»text» name=»login» /><br />
  Пароль <input type=»password» name=»password» /><br />
  <input name=»submit» type=»submit» value=»Зарегистрироваться»>
  </form>
  <?php
    if (isset($err)) {
      print «<b>При регистрации произошли следующие ошибки:</b><br>»;
      foreach($err AS $error)
      {
        print $error.»<br>»;
      }  
    }
  ?>

login.php

Опять кратко расскажу о действиях совершаемых в данном скрипте. В самом начале у нас висит функция для генерации случайной строки, она служит для хеша пользователя (чуть позже более подробно). Далее мы проверяем наличие куков с ошибками (они ставятся в check.php). Подключаем файл конфигурации и проверяем пользователя. Вытаскиваем из бд логин и пароль, сравниваем с введенными и генерируем хеш. Записываем в бд новый хеш пользователя и ставим куки. В куках находится id и хеш пользователя. Пересылаем пользователя на check.php.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

<?php
  # Функция для генерации случайной строки
  function generateCode($length=6) {
    $chars = «abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRQSTUVWXYZ0123456789»;
    $code = «»;
    $clen = strlen($chars) — 1;  
    while (strlen($code) < $length) {
        $code .= $chars[mt_rand(0,$clen)];  
    }
    return $code;
  }
 
  # Если есть куки с ошибкой то выводим их в переменную и удаляем куки
  if (isset($_COOKIE[‘errors’])){
      $errors = $_COOKIE[‘errors’];
      setcookie(‘errors’, », time() — 60*24*30*12, ‘/’);
  }

  # Подключаем конфиг
  include ‘conf.php’;

  if(isset($_POST[‘submit’]))
  {
   
    # Вытаскиваем из БД запись, у которой логин равняеться введенному
    $data = mysql_fetch_assoc(mysql_query(«SELECT users_id, users_password FROM `users` WHERE `users_login`='».mysql_real_escape_string($_POST[‘login’]).»‘ LIMIT 1″));
     
    # Соавниваем пароли
    if($data[‘users_password’] === md5(md5($_POST[‘password’])))
    {
      # Генерируем случайное число и шифруем его
      $hash = md5(generateCode(10));
           
      # Записываем в БД новый хеш авторизации и IP
      mysql_query(«UPDATE users SET users_hash='».$hash.»‘ WHERE users_id='».$data[‘users_id’].»‘») or die(«MySQL Error: » . mysql_error());
       
      # Ставим куки
      setcookie(«id», $data[‘users_id’], time()+60*60*24*30);
      setcookie(«hash», $hash, time()+60*60*24*30);
       
      # Переадресовываем браузер на страницу проверки нашего скрипта
      header(«Location: check.php»); exit();
    }
    else
    {
      print «Вы ввели неправильный логин/пароль<br>»;
    }
  }
?>
  <form method=»POST»>
  Логин <input name=»login» type=»text»><br>
  Пароль <input name=»password» type=»password»><br>
  <input name=»submit» type=»submit» value=»Войти»>
  </form>
  <?php
  # Проверяем наличие в куках номера ошибки
  if (isset($errors)) {print ‘<h5>’.$error[$errors].'</h5>’;}

  ?>

check.php

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

<?php
# подключаем конфиг
include ‘conf.php’;  

# проверка авторизации
if (isset($_COOKIE[‘id’]) and isset($_COOKIE[‘hash’]))
{    
    $userdata = mysql_fetch_assoc(mysql_query(«SELECT * FROM users WHERE users_id = ‘».intval($_COOKIE[‘id’]).»‘ LIMIT 1″));

    if(($userdata[‘users_hash’] !== $_COOKIE[‘hash’]) or ($userdata[‘users_id’] !== $_COOKIE[‘id’]))
    {
        setcookie(‘id’, », time() — 60*24*30*12, ‘/’);
        setcookie(‘hash’, », time() — 60*24*30*12, ‘/’);
    setcookie(‘errors’, ‘1’, time() + 60*24*30*12, ‘/’);
    header(‘Location: login.php’); exit();
    }
}
else
{
  setcookie(‘errors’, ‘2’, time() + 60*24*30*12, ‘/’);
  header(‘Location: login.php’); exit();
}
?>
<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Transitional//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»>
<html xmlns=»http://www.w3.org/1999/xhtml» xml:lang=»en»>
<head>
  <meta http-equiv=»Content-Type» content=»text/html;charset=UTF-8″ />
  <title></title>
</head>
<body>
  hello!
</body>
</html>

Выход

Выход можно осуществить любым удобным для вас способом просто удалив куки, допустим так:

1
2
3
4
5
6
7
8
9

<form action=»» method=»post»><input type=’submit’ name=’exit’ value=’Выйти’/></form>
<?php
if($_REQUEST[‘exit’])
  {
        setcookie(‘id’, », time() — 60*60*24*30, ‘/’);
        setcookie(‘hash’, », time() — 60*60*24*30, ‘/’);
        header(‘Location: login.php’); exit();
  }
?>

Сразу хочу предупредить о том что ваши файлы должны быть в кодировке UTF8 и БЕЗ BOM! Приятного пользования!

Теги: Cookie, MD5, MySQL, PHP, Авторизация

programmer-weekdays.ru

Как сделать регистрацию и авторизацию пользователей на сайте

Вы здесь:
Главная — PHP — PHP Основы — Как сделать регистрацию и авторизацию пользователей на сайте


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

Существует несколько способов создания регистрации и авторизации пользователей, но в этой статье я разберу свой любимый — через механизм сессий или cookie.

Первым делом, если Вы хотите сделать регистрацию у себя на сайте, то необходимо понимать, где будут храниться данные о пользователях. Можно хранить в обычном текстовом файле, в XML-файле, либо в базе данных. Первые два варианта — очень опасные, поэтому не рекомендую Вам ими пользоваться. А вот третий вариант — хранение информации о пользователях в базе данных — самый популярный, и именно этим способом хранения информации я советую Вам пользоваться.

С местом хранения определились. Теперь перейдём непосредственно к алгоритму авторизации:

  1. Создать форму регистрации на HTML.
  2. Получить данные из формы в скрипте-обработчике.
  3. Проверить полученные данные, и если они некорректны, то сделать редирект обратно на форму регистрации.
  4. Если данные корректны, то записать их в базу данных.

Вот и весь процесс регистрации пользователя на сайте. То есть регистрация — это сохранение информации о пользователе на сайте.

Дальнейшим пунктом является авторизация пользователя на сайте, однако, прежде чем к нему переходить, расскажу об одном важном моменте в форме регистрации — пароле. Я Вам настоятельно рекомендую не хранить пароли в открытом виде (например так, «123456«). Обязательно их шифруйте, хотя бы с помощью функции md5(). И в базе данных храните именно зашифрованный пароль.

Теперь авторизация. Первое, что Вы должны понять — это то, что информация об авторизации должна где-то храниться. Самый простой вариант — это хранение информации в сессии (или в cookie). А теперь алгоритм:

  1. Создать форму авторизации пользователя на HTML, куда пользователь должен будет ввести свой логин и пароль.
  2. В скрипте-обработчике принять данные от пользователя. Если Вы меня послушались, и храните шифрованные пароли в базе данных, то сначала шифруйте полученный пароль. Если же в базе данных лежат открытые пароли, то шифровать не надо.
  3. Проверить правильность введённых данных, и если логин и пароль совпадают с существующим пользователем в базе данных, то записываете в cookie или сессию информацию с логином и шифрованным паролем (либо открытым паролем, если Вы его не шифровали).
  4. Если логин и/или пароль введены неверно, то делать редирект обратно на форму авторизации.

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

И последнее. Как делается кнопка «Выход«? Очень просто. При нажатии на эту кнопку, стираются cookie, либо сессия. Таким образом, пользователь автоматически вылетает с сайта.

Как видите, всё элементарно, но при реализации этого алгоритма у Вас обязательно возникнет множество вопросов. Например, что делать при регистрации пользователя, логин которого уже имеется в базе данных. Реализация различных проверок входных данных, реализация проверки существования e-mail и прочее — всё это является достаточно сложным, если Вы делаете это в первый раз. Однако, самый сок я выдал. Если будут вопросы при реализации, то спрашивайте либо на форуме, либо в комментариях.

В данной статье я привёл лишь алгоритм, а чтобы научиться его реализовывать нужно знать PHP и MySQL, которые максимально подробно разобраны в этом обучающем курсе: http://srs.myrusakov.ru/php


  • Создано 05.05.2011 13:05:46



  • Михаил Русаков

Предыдущая статья Следующая статья

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):


  1. Кнопка:

    <a href=»https://myrusakov.ru» target=»_blank»><img src=»https://myrusakov.ru//images/button.gif» alt=»Как создать свой сайт» /></a>

    Она выглядит вот так:


  2. Текстовая ссылка:
    <a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    [URL=»https://myrusakov.ru»]Как создать свой сайт[/URL]

myrusakov.ru

Урок по созданию регистрации и авторизации на PHP

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

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

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

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

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

В данном видеокурсе от компании WebForMySelf, мы рассмотрим способ создания скрипта регистрации на сайте, с помощью PHP, дополнительно рассмотрим вопрос авторизации пользователей на сайте.

Все уроки курса:

Количество уроков: 2

Продолжительность курса: 03:15:18

Автор: Виктор Гавриленко

Меня зовут Виктор Гавриленко. Еще учась в институте, начал увлекаться компьютерными технологиями и программированием, на протяжении многих лет усиленно занимаюсь разработкой интернет сайтов и веб-программированием.

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


Категории премиум

webformyself.com