Привет всем Хотелось бы сказать, что без регистрации на сайте - никуда. Сейчас регистрации используются везде: форумы, хостинги, чаты и многое другое. Хотелось бы описать, как сделать небольшую, вполне удобную регистрацию на сайте. Чтобы написать регистрацию, на хостинге должно быть: 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 "У вас отключены куки, попробуйте включить их в своем браузере. Если вы не знаете как, то погуглите :)"; } ?> Что-же, на этом у нас все Можно также прикрепить капчу к нашей регистрации и многое другое, надеюсь моя статья - была полезной для вас. Автор статьи: Я, Спасибо за внимание.
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 - можно было бы похвалить, старайтесь лучше.