Безпечний метод авторизації на PHP

1. Модель (клієнт)

Реєстрація - логін (a-z0-9) - пароль Вхід - логін - пароль Cookie - унікальний ідентифікатор користувача - хеш

Модель (сервер) MySQL

Таблиця users ____________________________________________

user_id (int(11)) user_login (Varchar(30)) user_password (varchar(32)) user_hash (varchar(32)) user_ip (int(10)) за замовчуванням 0 ____________________________________________

Чому треба зберігати в куках хеш випадково згенерованого рядка, а не хеш пароля?

__________________________________________________________ -- — Структура таблиці `users` — CREATE TABLE `users` ( ​​ `user_id` int(11) unsigned NOT NULL auto_increment, `user_login` varchar (30) NOT NULL, `user_password` varchar(32) NOT NULL, `user_hash` varchar(32) NOT NULL, `user_ip` int(10) unsigned NOT NULL default '0', PRIMARY KEY (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ; __________________________________________________________

__________________________________________________________ // Сторінка реєстрації нового користувача

# З'єднаємося з БД mysql_connect("localhost", "myhost", "myhost"); mysql_select_db("testtable");

# перевірити логін if(!preg_match("/^[a-zA-Z0-9]+$/",$_POST['login'])) $err[] = "Логін може складатися тільки з літер англійського алфавіту та цифр"; >

if(strlen($_POST['login']) 30) $err[] = "Логін повинен бути не менше 3-х символів і не більше 30"; >

# перевіряємо, чи не існує користувача з таким ім'ям $query = mysql_query("SELECT COUNT(user_id) FROM users WHEREuser_login='".mysql_real_escape_string($_POST['login'])."'"); if(mysql_result($query, 0) > 0) $err[] = "Користувач з таким логіном вже існує у базі даних"; >

# Якщо немає помилок, то додаємо до БД нового користувача if(count($err) == 0)

# Забираємо зайві прогалини і робимо подвійне шифрування $password = md5(md5(trim($_POST['password']))));

mysql_query("INSERT INTO users SET user_login='".$login."', user_password='".$password."'"); header("Location: login.php"); exit(); > else print "Під час реєстрації відбулися такі помилки: "; foreach($err AS $error) print $error." "; > > > __________________________________________________________

# Функція для генерації випадкового рядка function generateCode($length=6) $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789"; $code = ""; $clen = strlen($chars) - 1; while (strlen($code)