Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Что-то типа статьи %)
 
 автор: Гость   (06.07.2005 в 17:36)   письмо автору
 
 

На заказ написал (точнее пишу) статейку про авторизацию средствами рнр... посмотрите, может будут какие рекомендации, или замечания... %) так дружеский совет...
Написано не до конца... но смысл я думаю понятен %)

Итак "Безопасная авторизация средствами 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 ($login015);
$pass=substr ($pass025);
//Теперь когда за размер данных мы спокойны,
//приступим к составлению запроса в бд
//Для начала делаем хеш, пароля.
//Для чего?  - В запросе к бд 
//мы будем использовать именно хеш пароля
//это исключит лишние проверки на вводимые символы
//а вместе с этим и от 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:40)   письмо автору
 
   для: Гость   (06.07.2005 в 17:36)
 

Зы: можно (и нужно) критиковать %))))
Да и еще после, у вас после поподания 1 и буквы l, они начинают одинаково выглядеть...
 1 l 

   
 
 автор: Akira   (06.07.2005 в 18:38)   письмо автору
 
   для: Гость   (06.07.2005 в 17:40)
 

Посмотри мою %)

   
 
 автор: isset   (06.07.2005 в 18:28)   письмо автору
 
   для: Гость   (06.07.2005 в 17:36)
 

Лучше не выкладывать эту статью, я уже около трех логических ошибок нашел + сам код очень странный

   
 
 автор: Akira   (06.07.2005 в 18:37)   письмо автору
 
   для: Гость   (06.07.2005 в 17:36)
 

При беглом осмотре не нашел не куки не сессий...Так и надо?

   
 
 автор: Гость   (07.07.2005 в 05:30)   письмо автору
 
   для: Akira   (06.07.2005 в 18:37)
 

Я не стал затрагивать эту тему...

   
 
 автор: cheops   (06.07.2005 в 21:49)   письмо автору
 
   для: Гость   (06.07.2005 в 17:36)
 

Неплохо строки
<?php
$login
=$_POST['Login']; 
$pass=$_POST['Pass'];
?>

Явно прокомментировать, что это логин и пароль, которые передаются из HTML-формы.

   
 
 автор: cheops   (06.07.2005 в 21:55)   письмо автору
 
   для: Гость   (06.07.2005 в 17:36)
 

Не совсем чёткая проверка
<?php
$user1
=mysql_fetch_array($user); 
//Далее смотрим вернулся ли запрос - если нет значит такого пароля в БД нет 
if (!$user1)
?>

лучше переписать
<?php
//Далее смотрим вернулся ли запрос - если нет ни одной строки значит такого пароля в БД нет 
if (mysql_num_rows($user)==0)
?>

Кроме того использование переменных с цифрой на конце ($user1) является плохим тоном и не желательно прибегать к нему в стать - код лучше вылизать и дать переменным осмысленные имена

   
 
 автор: cheops   (06.07.2005 в 21:59)   письмо автору
 
   для: Гость   (06.07.2005 в 17:36)
 

Наличие конструкции elseif тяжело воспринимается и плохо читается - для увеличения читабельности кода лучше заменить её на if

   
 
 автор: cheops   (06.07.2005 в 22:02)   письмо автору
 
   для: Гость   (06.07.2005 в 17:36)
 

Сленг, вроде "бутафорс" лучше явно расшифровывать, так как например я впервые встречаю это слово и если бы не знал, для чего нужна задержка не понял бы назначение функции sleep().
Причём фразу
 //Используем sleep, для чего? - чтобы исключить

Лучше заменить на
 //Используем задержку в 2 секунды, для чего? - чтобы исключить

Так как читатель может не знать, об существовании функции sleep() и её предназначении и из первой фразы ничего не поймёт, а из второй фразы он сможет сразу догадаться о том, для чего предназначена функция.

   
 
 автор: cheops   (06.07.2005 в 22:04)   письмо автору
 
   для: Гость   (06.07.2005 в 17:36)
 

Из фразы
/*Так теперь мы уверены - поля для ввода не пустые, 
**и в них что-то есть %) 
**Теперь следует обрезать длину этих полей, 
**на тот случай если пользователь 
**локально изменит параметр maxlength

не понятно чем это может грозить - хорошо бы расшифровать зачем об этом следует беспокоиться.

   
 
 автор: Гость   (07.07.2005 в 05:15)   письмо автору
 
   для: cheops   (06.07.2005 в 22:04)
 

я же говорил что это не только пробный вариаен, все будет изменено на читаемое для непосвещенного пользователя, пока это только набросок.
Спиб за критику :) код несколько переработал...

2 isset : логические ошибки? можно указать?)
..

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования