А чем мы хуже других? Пусть тоже будет.
Правда статья получилась довольно внушительная, по этому подробности здесь, сам скрипт в аттаче.
Тут приведу только выдержки.
Система регистрации
Для учетных записей мы будем использовать базу данных MySQL.
1. Идентификатор. (уникальный ключ)
2. Дата регистрации
3. Логин
4. Пароль
4. E-mail
5. Хэш случайной строки для автологина.
6. Флаг активации.
Что бы создать такую таблицу (назавём её guest_user), нужно выполнить следующий запрос:
CREATE TABLE `irbis_user` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`date` TIMESTAMP NOT NULL ,
`login` VARCHAR( 50 ) NOT NULL ,
`password` VARCHAR( 32 ) NOT NULL ,
`hash` VARCHAR( 32 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL ,
`activate` INT( 1 ) NOT NULL ,
PRIMARY KEY ( `id` )
);
Прежде чем организовать учетную запись, нужно проверить, нет ли такого логина в наличии. Делается это простым запросом:
if($ok)
{
// Подсчитываем количество строк, удовлетворяющих условию
$res = mysql_query("SELECT COUNT(*) AS `cnt`
FROM `". DB_PREFIX ."user`
WHERE `login` = '". mysql_real_escape_string($user_login) ."'
");
// Если найдена хоть одна (а больше и не может быть)
if(mysql_result($res,0) > 0)
{
// Сообщаем юзеру неприятные известия
echo 'Есть у нас уже один '. $user_login .'. Попробуйте выбрать другой логин.';
}
else
{
// А если нет, создаем учетную запись
mysql_query("INSERT INTO `". DB_PREFIX ."user`
SET `login` = '". mysql_real_escape_string($user_login) ."',
`password` = '". mysql_real_escape_string($user_password) ."'
");
echo 'Все в порядке';
}
}
Вот по такой схеме уникальность логина будет обеспечена. А вход можно организовать так: смотрим, есть ли в базе запись, логин и пароль в которой совпадают с заявленными. Если есть - добро пожаловать. А на нет - суда нет.
if($ok)
{
// Подсчитываем количество строк, удовлетворяющих условию
$res = mysql_query("SELECT COUNT(*) AS `cnt`
FROM `". DB_PREFIX ."user`
WHERE `login` = '". mysql_real_escape_string($user_login) ."'
AND `password` = '". mysql_real_escape_string($user_password) ."'
");
// Если строка найдена, свой. А нет - пшол вон.
if(mysql_result($res,0) > 0)
echo 'Проходи!';
else
echo 'Стой, стрелять буду!';
}
Но это далеко не все. Многие начинающие программисты на этом успокаиваются, а зря. Потому что неаккуратно построенная система регистрации, это опасность не только для сайта, но и для самого юзера.
...никто, абсолютно никто, включая владельца сайта, не должен знать пароль юзера от его аккаунта.
А как же тогда быть? Очень просто. Есть специальный алгоритм одностороннего шифрования. Делает это функция md5().
...Есть еще один способ усложнить жизнь нечистым наруку хакерам. Это так называемая соль. Соль, это набор символов, который добавляется к паролю в момент регистрации и потом в момент авторизации.
...На сайтах для такого действия (называется автологин) используется механизм COOKIE. Это информация, запоминаемая браузером и предъявляемая для опознания по требованию сервера. То есть мы можем записать в куку хэш пароля и при авторизации запрашивать пароль не из текстового поля, а сразу из куки.
Но тут два важных момента.
Первый, это то, что не все хотят пользоваться автологином. Не любят, не доверяют, с чужого компьютера заходят и так далее. По этому нельзя автологин делать принудительным. Нужно дать возможность выбора.
И второй. Кука, так как находится в браузере пользователя, довольно уязвимая вещь. Так что выносить в неё пароль, пусть трижды захэшированный, очень опрометчивое решение.
...Есть еще одна тонкость. Для генерации случайной строки часто используется штатная функция php rand() или её производные. Дело в том, что эта функция выдает псевдослучайное число, которое при определенных действиях прогнозируется и вычисляется.
...Здесь мы генерим уникальный хэш, который сам по себе не несет никакой полезной информации, записываем его в куку и специальное поле в таблице. Теперь идентифицировать пользователя можно сверяя значение куки со значением этого поля.
...Достаточно один раз открыить ячейку (войти в аккаунт), что бы достать все сразу (посмотреть все страницы).
Для этого мы будем использовать механизм сессий. Авторизовав юзера один раз при входе, мы запишем в сессию всю необходимую информацию о нем и будем брать оттуда, попутно проверяя на каждой странице - свой это или чужой.
...Если у нас есть вход, то должен быть и выход. Иначе аккаунт будет доступен любому, кто сядет за компьютер после нашего сержанта (тьфу, юзера).
...Ну а если вдруг юзер забудет пароль? Пропадай добро?
Нужна система восстановления.
Есть несколько вариантов, мы рассмотрим систему, когда временный пароль отсылается на E-mail.
...А пока, раз у нас есть система отправки кода на E-mail, можно сделать активацию учетной записи по письму. Это помогает от автоматической регистрации всевозможных спам-ботов.
...Мы сделали отдельным модулем, который можно вставить в любой рабочий сайт всего двумя строчками.
PS Тему я закрыл, потому что она довольно объёмная и все вопросы не вместит по определению. Если есть таковые, либо поправки и замечания, задавайте в других темах.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.
Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.
Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.