[PHP] Регистрация с использованием MySQL

Discussion in 'PHP' started by Vova93, 13 Aug 2011.

  1. Vova93

    Vova93 Banned

    Joined:
    5 Jul 2011
    Messages:
    1
    Likes Received:
    6
    Reputations:
    10
    Привет всем :rolleyes:
    Хотелось бы сказать, что без регистрации на сайте - никуда.
    Сейчас регистрации используются везде: форумы, хостинги, чаты и многое другое.

    Хотелось бы описать, как сделать небольшую, вполне удобную регистрацию на сайте.
    Чтобы написать регистрацию, на хостинге должно быть:
    PHP,
    MySQL;


    Наша регистрация будет состоять из логина и пароля (a-z,A-Z,0-9)
    Давайте начнем с сервера MySQL:

    Таблица users:
    Code:
     user_id (int(11))
     user_login (Varchar(30))
     user_password (varchar(32))
     user_hash (varchar(32))
     user_ip (int(10)) по умолчанию 0
    
    При регистрации в базу данных мы будем записывать логин и пароль, который будет в двойном MD5 шифровании.

    При успешной авторизации, в БД вписывается это:
    user_hash - хеш пользователя, который генерируется при успешной авторизации нашего пользователя
    user_ip - здесь будет IP нашего пользователя

    В Cookies нашего пользователя, мы впишем его идентификатор и сгенерированный хеш.

    Вроде все понятно описал -
    Теперь давайте приступим к реализации нашей регистрации.


    Структура таблицы `users` в базе данных 'testtable'
    Code:
    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 ;
    
    Теперь давайте создадим файл reg.php и впишем в него следующее:
    Code:
    <?php
    // Рега нового пользователя
    
    // Соединяемся с БД
    mysql_connect("localhost", "mysql_user", "mysql_password");
    mysql_select_db("testtable");
    
    
    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']) > 20)
        {
            $err[] = "Логин должен быть не меньше 3-х символов и не больше 20"; // Можете изменить на свои параметры
        }
        
        // Проверяем, существует ли пользователь с таким именем
        $query = mysql_query("SELECT COUNT(user_id) FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."'");
        if(mysql_result($query, 0) > 0)
        {
            $err[] = "Пользователь с таким логином уже существует в базе данных";
        }
        
        // Если нет, то добавляем в БД нового пользователя
        if(count($err) == 0)
        {
            
            $login = $_POST['login'];
            
            // Убераем лишние пробелы и делаем двойное MD5 шифрование
            $password = md5(md5(trim($_POST['password'])));
            
            mysql_query("INSERT INTO users SET user_login='".$login."', user_password='".$password."'");
            header("Location: auth.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>
    ?>
    

    Что-же, теперь создаем файл auth.php, в котором будет находится наша авторизация
    Code:
    <?php
    // Страница авторизации
    
    // Функция для генерации случайной строки
    function generateCode($length=6) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
        $code = "";
        $clen = strlen($chars) - 1;  
        while (strlen($code) < $length) {
                $code .= $chars[mt_rand(0,$clen)];  
        }
        return $code;
    }
    
    
    // Соединямся с Базой данных
    mysql_connect("localhost", "mysql_user", "mysql_password");
    mysql_select_db("testtable");
    
    if(isset($_POST['submit']))
    {
        // Вытаскиваем из базы запись, у которой логин равняется введенному
        $query = mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1");
        $data = mysql_fetch_assoc($query);
        
        // Сравниваем наши пароли
        if($data['user_password'] === md5(md5($_POST['password'])))
        {
            // Генерируем случайное число и шифруем его
            $hash = md5(generateCode(10));
                
            if(!@$_POST['not_attach_ip'])
            {
                // Если пользователь выбрал привязку к IP
                // Переводим IP в строку
                $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
            }
            
            // Записываем в БД новый хеш авторизации и IP
            mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");
            
            // Ставим куки
            setcookie("id", $data['user_id'], time()+60*60*24*30);
            setcookie("hash", $hash, time()+60*60*24*30);
            
            // Переадресовываем браузер на страницу проверки нашего скрипта
            header("Location: user.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>
    ?>
    
    Что-же, теперь создаем файл проверки.. Назовем его user.php

    Code:
    
    <?php
    // Скрипт проверки
    
    // Соединямся с Базой данных
    mysql_connect("localhost", "mysql_user", "mysql_password");
    mysql_select_db("testtable");
    
    if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))
    {   
        $query = mysql_query("SELECT *,INET_NTOA(user_ip) AS user_ip FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1");
        $userdata = mysql_fetch_assoc($query);
    
        if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id'])
     or (($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR'])  and ($userdata['user_ip'] !== "0")))
        {
            setcookie("id", "", time() - 3600*24*30*12, "/");
            setcookie("hash", "", time() - 3600*24*30*12, "/");
            print "Ошибка:( Попробуй еще раз о_О";
        }
        else
        {
            print "Привет, ".$userdata['user_login'].". Ты успешно авторизовался на нашем сайте, желаем тебе приятно провести время";
        }
    }
    else
    {
        print "У вас отключены куки, попробуйте включить их в своем браузере. Если вы не знаете как, то погуглите :)";
    } 
    ?>
    
    Что-же, на этом у нас все :)
    Можно также прикрепить капчу к нашей регистрации и многое другое, надеюсь моя статья - была полезной для вас.
    Автор статьи: Я,
    Спасибо за внимание.
     
    #1 Vova93, 13 Aug 2011
    Last edited: 16 Aug 2011
    5 people like this.
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Vova93 1) При register_globals=On будет инъекция тут:
    PHP:
            mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");
    2) Поставьте ссылку на оригинал, видимо тут - http://www.titorov.ru/index.php?option=com_content&task=view&id=87&Itemid=176
    3) Если бы написали сами и для PDO или mysqli - можно было бы похвалить, старайтесь лучше.
     
    _________________________
Loading...
Similar Threads - Регистрация использованием MySQL
  1. GAiN
    Replies:
    3
    Views:
    7,450