Раздел по чистому программированию давно удалён, поэтому создаю тему тут.
В общем появилась задача сделать личный кабинет. То есть стандартные функции:
1. авторизация
2. регистрация
3. вост. пароля
4. ну и соответственно держать сессию по кукам
Функции стандартные и везде (форумы, чаты, лк, почты и тд) это реализовано относительно одинаково. Отсюда вопрос, нет ли готового решения в виде простого набора этих функций? Ну что-то типа шаблона, чтоли.. Просто муторно всё это делать, когда это уже двести раз всеми реализовано.
Я не оказываю услуги гаранта!
База данных кидал: blacklist.rf-cheats.ru
Обязательно проверяйте человека через чёрный список прежде чем совершать с ним сделку.
Если рядом лежит IPB форум, то можно через его API авторизовываться.
А так - везде в simphony, yii, kohana уже давно модули готовые на соответствующих сайтах написанные лежат. Прикручиваешь и все.
Если самописное надо - могу дать свой пример.
Если рядом лежит IPB форум, то можно через его API авторизовываться.
А так - везде в simphony, yii, kohana уже давно модули готовые на соответствующих сайтах написанные лежат. Прикручиваешь и все.
Если самописное надо - могу дать свой пример.
Я не оказываю услуги гаранта!
База данных кидал: blacklist.rf-cheats.ru
Обязательно проверяйте человека через чёрный список прежде чем совершать с ним сделку.
Есть готовые варианты (гуглить по ACL или Authentication library), но опять же в случае php крайне рекомендую хоть самый простой, но фреймворк, удобнее и быстрее будет в разы
Модель (сервер)
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;) < 3 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($query, 0) > 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", $hash, time()+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 "Включите куки";
}
?>
Я делаю всегда вот на этом скелете, все очень понятно, безопасно, и универсально.
Не, ну я понимаю что теме 1.5 года, но твой код с хешем, который ты mt_rand генерируешь вместо использования стандартных сессий, эт нечто, погугли получше про mt_rand, вообще не понимаю почему стандартные сессии не использовать, хоть убей