|
|
|
| На заказ написал (точнее пишу) статейку про авторизацию средствами рнр... посмотрите, может будут какие рекомендации, или замечания... %) так дружеский совет...
Написано не до конца... но смысл я думаю понятен %)
Итак "Безопасная авторизация средствами PHP"
Все буду активно смачивать коменнтами, дабы не не рушить структуру кода, кроме того постараюсь его максимально упростить, на самом деле он гораздо компактнее. У меня это все работает в одной форме, сейчас я для наглядности разобью это на 2-е формы - "go.php" и "goo.php"
Кроме того данные о пользователе будут извлекаться из таблицы mySQL базы, с примером как избежать в этом случае SQL инъекции.
Грубое содержание файла "go.php"
<html>
<body>
<?=$_GET['alert']?>
<form action ="goo.php" method="post">
Логин :<input type="text" name="Login" maxlength="15">
Пароль :</td><td><input type="password" name="Pass" maxlength="25">
<input type="submit" value="Зайти в игру">
</form>
</body>
</html>
|
Содержание обработчика - "goo.php":
<?
/*Итак начало скрипта авторизации
**Для начала почему передаем данные
**именно методом POST?
**Это несколько усложнит попытки пользователя
**"взломать" скрипт, а точнее создаст небольшие неудобства.
** Следующие стоки - принимаем данные, причем
**именно те которые получены методом POST, игнорируя GET, и куки.
*/
$login=$_POST['Login'];
$pass=$_POST['Pass'];
/*Хочется отметить что при указании переменных имеет значение
**их регистр (во избежание возможных ошибок)
**Далее проверяем указано ли что-нибуть в переменных $login и $pass
*/
if (empty($login) || empty($pass))
{
//Если не указано, то возвращаем пользователя
//на страницу ввода логина и пароля
header("Location: go.php?alert=Не указан логин или пароль");
//На всякий случай завершаем выполнение скрипта
exit;
}
/*Так теперь мы уверены - поля для ввода не пустые,
**и в них что-то есть %)
**Теперь следует обрезать длину этих полей,
**на тот случай если пользователь
**локально изменит параметр maxlength
*/
$login=substr ($login, 0, 15);
$pass=substr ($pass, 0, 25);
//Теперь когда за размер данных мы спокойны,
//приступим к составлению запроса в бд
//Для начала делаем хеш, пароля.
//Для чего? - В запросе к бд
//мы будем использовать именно хеш пароля
//это исключит лишние проверки на вводимые символы
//а вместе с этим и от SQL инъекции
$pass=md5($pass);
//Теперь инклужу суда фаил "dbconfig.php",
//содержащий код подключения к БД
include "dbconfig.php";
//Теперь делаем запрос в БД
//Читать его так: выбрать "login", из таблицы users, где пароль равен переменной "pass"
$user=mysql_query("select 'login' FROM 'users' WHERE passwd = '".$pass."'");
$user1=mysql_fetch_array($user);
//Далее смотрим вернулся ли запрос - если нет значит такого пароля в БД нет
if (!$user1)
{
//Значит такого пасса нет? Тогда :
//Используем sleep, для чего? - чтобы исключить
//простейший бутафорс...
//можно поставить и боьлше - будет только эфективнее...
sleep (2);
//Возвращаем пользователя на главную страницу
//И заодно указываем сообщение которое будет выводится на главной странице
header("Location: go.php?alert=Неверный логин или пароль");
//На всякий случай завершаем выполнение скрипта
exit;
}
//Иначе сравниваем значение логина с веденным логином %)
#######
elseif ($user1['login']==$login)
{
//Тут находится код авторизующий
//пользователя (выдача кук/старт сеанса)
}
else
{
//иначе:
sleep (2);
//Возвращаем пользователя на главную страницу
//И заодно указываем сообщение которое будет выводится на главной странице
header("Location: go.php?alert=Неверный логин или пароль");
//На всякий случай завершаем выполнение скрипта
exit;
}
//конец скрипта
?>
|
Теперь рассмотрю некоторые дополнения, к скрипту, а именно сразу возникает вопрос что будет если у нескольких пользователей совпадут пароли...
Для этого нужно заменить код со строки ######" и до конца на цикл вида: :
else
{
while ($user2=mysql_fetch_array($user))
{
if ($user2['login']==$login)
{
//Авторизующий код
exit;
}
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Гость
(06.07.2005 в 17:36)
| | Зы: можно (и нужно) критиковать %))))
Да и еще после, у вас после поподания 1 и буквы l, они начинают одинаково выглядеть...
| |
|
|
|
|
|
|
|
для: Гость
(06.07.2005 в 17:40)
| | Посмотри мою %) | |
|
|
|
|
|
|
|
для: Гость
(06.07.2005 в 17:36)
| | Лучше не выкладывать эту статью, я уже около трех логических ошибок нашел + сам код очень странный | |
|
|
|
|
|
|
|
для: Гость
(06.07.2005 в 17:36)
| | При беглом осмотре не нашел не куки не сессий...Так и надо? | |
|
|
|
|
|
|
|
для: Akira
(06.07.2005 в 18:37)
| | Я не стал затрагивать эту тему... | |
|
|
|
|
|
|
|
для: Гость
(06.07.2005 в 17:36)
| | Неплохо строки
<?php
$login=$_POST['Login'];
$pass=$_POST['Pass'];
?>
|
Явно прокомментировать, что это логин и пароль, которые передаются из HTML-формы. | |
|
|
|
|
|
|
|
для: Гость
(06.07.2005 в 17:36)
| | Не совсем чёткая проверка
<?php
$user1=mysql_fetch_array($user);
//Далее смотрим вернулся ли запрос - если нет значит такого пароля в БД нет
if (!$user1)
?>
|
лучше переписать
<?php
//Далее смотрим вернулся ли запрос - если нет ни одной строки значит такого пароля в БД нет
if (mysql_num_rows($user)==0)
?>
|
Кроме того использование переменных с цифрой на конце ($user1) является плохим тоном и не желательно прибегать к нему в стать - код лучше вылизать и дать переменным осмысленные имена | |
|
|
|
|
|
|
|
для: Гость
(06.07.2005 в 17:36)
| | Наличие конструкции elseif тяжело воспринимается и плохо читается - для увеличения читабельности кода лучше заменить её на if | |
|
|
|
|
|
|
|
для: Гость
(06.07.2005 в 17:36)
| | Сленг, вроде "бутафорс" лучше явно расшифровывать, так как например я впервые встречаю это слово и если бы не знал, для чего нужна задержка не понял бы назначение функции sleep().
Причём фразу
//Используем sleep, для чего? - чтобы исключить
|
Лучше заменить на
//Используем задержку в 2 секунды, для чего? - чтобы исключить
|
Так как читатель может не знать, об существовании функции sleep() и её предназначении и из первой фразы ничего не поймёт, а из второй фразы он сможет сразу догадаться о том, для чего предназначена функция. | |
|
|
|
|
|
|
|
для: Гость
(06.07.2005 в 17:36)
| | Из фразы
/*Так теперь мы уверены - поля для ввода не пустые,
**и в них что-то есть %)
**Теперь следует обрезать длину этих полей,
**на тот случай если пользователь
**локально изменит параметр maxlength
|
не понятно чем это может грозить - хорошо бы расшифровать зачем об этом следует беспокоиться. | |
|
|
|
|
|
|
|
для: cheops
(06.07.2005 в 22:04)
| | я же говорил что это не только пробный вариаен, все будет изменено на читаемое для непосвещенного пользователя, пока это только набросок.
Спиб за критику :) код несколько переработал...
2 isset : логические ошибки? можно указать?)
.. | |
|
|
|