Показать сообщение отдельно
Старый 22.09.2014, 00:45  
JEY
Старая гвардия
Аватар для JEY
OFFLINE
Регистрация: 12.05.2008
Сообщений: 466
Благодарностей:
1,129 всего
Мнения: + 4596
Репутация: 3562
Отправить сообщение для JEY с помощью ICQ Отправить сообщение для JEY с помощью Skype™

Модель (клиент)
Регистрация
— логин (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

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

Практика
Код:
-- 
-- Структура таблицы `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 ;

register.php

PHP код:
<?
// Страница регситрации нового пользователя
# Соединямся с БД
mysql_connect("localhost""myhost""myhost");
mysql_select_db("testtable");
if(isset(
$_POST***91;'submit'***93;))
{
$err = array();
# проверям логин
    
if(!preg_match("/^***91;a-zA-Z0-9***93;+$/",$_POST***91;'login'***93;))
    {
        
$err***91;***93; = "Логин может состоять только из букв английского алфавита и цифр";
    }
    if(
strlen($_POST***91;'login'***93;) < or strlen($_POST***91;'login'***93;) > 30)
    {
        
$err***91;***93; = "Логин должен быть не меньше 3-х символов и не больше 30";
    }
    
# проверяем, не сущестует ли пользователя с таким именем
    
$query mysql_query("SELECT COUNT(user_id) FROM users WHERE user_login='".mysql_real_escape_string($_POST***91;'login'***93;)."'");
    if(
mysql_result($query0) > 0)
    {
        
$err***91;***93; = "Пользователь с таким логином уже существует в базе данных";
    }
    
# Если нет ошибок, то добавляем в БД нового пользователя
    
if(count($err) == 0)
    {
        
$login $_POST***91;'login'***93;;
        
# Убераем лишние пробелы и делаем двойное шифрование
        
$password md5(md5(trim($_POST***91;'password'***93;)));
        
mysql_query("INSERT INTO users SET user_login='".$login."', user_password='".$password."'");
        
header("Location: login.php"); exit();
    }
    else
    {
        print 
"<b>При регистрации произошли следующие ошибки:</b><br>";
        foreach(
$err AS $error)
        {
            print 
$error."<br>";
        }
    }
}
?>
<form method="POST">
Логин <input name="login" type="text"><br>
Пароль <input name="password" type="password"><br>
<input name="submit" type="submit" value="Зарегистрироваться">
</form>
login.php

PHP код:
<?
// Страница авторизации
# Функция для генерации случайной строки
function generateCode($length=6) {
    
$chars "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
    
$code "";
    
$clen strlen($chars) - 1;  
    while (
strlen($code) < $length) {
            
$code .= $chars***91;mt_rand(0,$clen)***93;;  
    }
    return 
$code;
}
# Соединямся с БД
mysql_connect("localhost""myhost""myhost");
mysql_select_db("testtable");
if(isset(
$_POST***91;'submit'***93;))
{
    
# Вытаскиваем из БД запись, у которой логин равняеться введенному
    
$query mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST***91;'login'***93;)."' LIMIT 1");
    
$data mysql_fetch_assoc($query);
# Соавниваем пароли
    
if($data***91;'user_password'***93; === md5(md5($_POST***91;'password'***93;)))
    {
        
# Генерируем случайное число и шифруем его
        
$hash md5(generateCode(10));
if(!@
$_POST***91;'not_attach_ip'***93;)
        {
            
# Если пользователя выбрал привязку к IP
            # Переводим IP в строку
            
$insip ", user_ip=INET_ATON('".$_SERVER***91;'REMOTE_ADDR'***93;."')";
        }
        
# Записываем в БД новый хеш авторизации и IP
        
mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data***91;'user_id'***93;."'");
        
# Ставим куки
        
setcookie("id"$data***91;'user_id'***93;, time()+60*60*24*30);
        
setcookie("hash"$hashtime()+60*60*24*30);
        
# Переадресовываем браузер на страницу проверки нашего скрипта
        
header("Location: check.php"); exit();
    }
    else
    {
        print 
"Вы ввели неправильный логин/пароль";
    }
}
?>
<form method="POST">
Логин <input name="login" type="text"><br>
Пароль <input name="password" type="password"><br>
Не прикреплять к IP(не безопасно) <input type="checkbox" name="not_attach_ip"><br>
<input name="submit" type="submit" value="Войти">
</form>


check.php
PHP код:
<?
// Скрипт проверки
# Соединямся с БД
mysql_connect("localhost""myhost""myhost");
mysql_select_db("testtable");
if (isset(
$_COOKIE***91;'id'***93;) and isset($_COOKIE***91;'hash'***93;))
{   
    
$query mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '".intval($_COOKIE***91;'id'***93;)."' LIMIT 1");
    
$userdata mysql_fetch_assoc($query);
    if((
$userdata***91;'user_hash'***93; !== $_COOKIE***91;'hash'***93;) or ($userdata***91;'user_id'***93; !== $_COOKIE***91;'id'***93;)
 or ((
$userdata***91;'user_ip'***93; !== $_SERVER***91;'REMOTE_ADDR'***93;)  and ($userdata***91;'user_ip'***93; !== "0")))
    {
        
setcookie("id"""time() - 3600*24*30*12"/");
        
setcookie("hash"""time() - 3600*24*30*12"/");
        print 
"Хм, что-то не получилось";
    }
    else
    {
        print 
"Привет, ".$userdata***91;'user_login'***93;.". Всё работает!";
    }
}
else
{
    print 
"Включите куки";
}
?>


Я делаю всегда вот на этом скелете, все очень понятно, безопасно, и универсально.

ICQ: 751228
Skype: Jeye51
E-Mail: Jey-n70@ya.ru


Научу кидать людей на деньги. Оплата: 50% до обучения, 50% после.
 
Ответить с цитированием