Безпечний метод авторизації на 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)