Проверьте плз. скрипт авторизации

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Проверьте плз. скрипт авторизации

Здраствуйте
возникла необходимость авторизации юзеров для обновления базы (чтоб знать, кто что когда зделал)
Сначала скрипт был закрит апачем.

Теперь нужно сделать авторизацию через базу
вот как это сделал я:

1. Юзер вызывает страницу логина (login.html)

c с етой страницы екшн на login.php

2. В login.php выполняются следуйщие действия:

PHP:
<?
if (!isset($ok)) { //если не нажата кнопка - редирект на login.html
  header ("Location: login.html");
  exit;
}
if (empty($user) or empty($pass)) {//если пустые поля - редирект на login.html
  header ("Location: login.html");
  exit;
}
if (isset($ok)) { //если нажата кнопка
  require ("db.php");
  $sql="SELECT * from users WHERE user='$user' and pass='$pass'";//выборка из базы 
  $result = mysql_query($sql);
  while($data=mysql_fetch_array($result)) {
    if ($user==$data[user] and $pass==$data[pass]) {//если юзер и пароль из формы=юзерю и паролю из базы
      setcookie ("user_", $data[user]);//установка кукисов
      setcookie ("pass_", $data[pass]);
    }
    header ("Location: regional.php");//если все в порядке - редирект на страницу администрирования
    exit;
  }
  if(!($data=@mysql_fetch_array($result))) { //если нулевой результат - редирект на логин
    header ("Location: login.html");
    exit; 
  }
}
?>
3. В каждом скрипте из административной части выполняется такая проверка:
<?
if (!isset($user_) or (!isset($pass_))) {//если не установ. куки
  header ("Location: login.html");
  exit;
}
if (isset($user_) and (isset($pass_))) { //если в куки установленл.
  require ("db.php");
  $sql="SELECT * from users WHERE user='$user_' and ";
  $result = mysql_query($sql);
  if(!($data=@mysql_fetch_array($result))) {//если нулевой результат - редирект
    header ("Location: login.html");
    exit;
  }
  while($data=mysql_fetch_array($result)) {
    $data[user]=$data[user];
    $data[pass]=$data[pass];
    if (($user_==$data[user]) and ($pass_==$data[pass])) { //если юзер и пасс из куков = юзеру и пасу из базы
      setcookie ("user_", $data[user]);
      setcookie ("pass_", $data[pass]);
    }
    if (($user_!==$data[user]) or ($pass_!==$data[pass])) {//если не = то редирект
      header ("Location: login.html");
      exit;
    }
  }
}
?>
Скажите плз. что я не учёл, что не заметил? Возможно что-то пропустил. Буду очень благодарен. Спасибо
 

begemot

Guest
Во первых пароль надо шифровать (функция PASSWORD в mysql или md5 в php)

Во вторых нафиг хранить пароль и логин в куках. Проверил на первой странице пароль с логином занес в сессию id пользователя или логин, смотря как таблица юзеров организована.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
до сессий я ещё не дорос :(

Во первых пароль надо шифровать (функция PASSWORD в mysql или md5 в php)
а поподробнее можно?

Во вторых нафиг хранить пароль и логин в куках
они проверяются на каждой "адниминистративной" странице третим скриптом (если не установлены, умный юзер решил не через логин зайти, а напрямую - то ему отлуп)
 

grayangel

равновесник
Re: Проверьте плз. скрипт авторизации

Тоже немного замечаний (в виде комментариев в коде):

Автор оригинала: Mr_Max

PHP:
<?
if (!isset($ok))//если не нажата кнопка - редирект на login.html
  {
// По всем правилам положено давать полный URL в хидерах.
  header ("Location: login.html");
  exit;
  }

if (empty($user) or empty($pass))//если пустые поля - редирект на login.html
  {
  header ("Location: login.html");
  exit;
  }

// Следующее условие здесь лишнее - оно уже проверялось
// самым первым.
if (isset($ok))//если нажата кнопка
  {
  require ("db.php");
// Переменные $user и $pass проверяются на предмет лишних символов и размера?
  $sql="SELECT * from users WHERE user='$user' and pass='$pass'";//выборка из базы 

  $result = mysql_query($sql);

  while($data=mysql_fetch_array($result))
    {
      if ($user==$data[user] and $pass==$data[pass])//если юзер и пароль из формы=юзерю и паролю из базы
       {
       setcookie ("user_", $data[user]);//установка кукисов
// А вот это, совсем уже плохой тон - совать пароль в куку (ИМХО)
       setcookie ("pass_", $data[pass]);
       }
     header ("Location: regional.php");//если все в порядке - редирект на страницу администрирования
     exit;
   }
  if(!($data=@mysql_fetch_array($result)))//если нулевой результат - редирект на логин
  {header ("Location: login.html");
  exit; 
}
}
?>
....

Скажите плз. что я не учёл, что не заметил? Возможно что-то пропустил. Буду очень благодарен. Спасибо
Лучше используй сессии - геморроя будет гораздо меньше.
 

tony2001

TeaM PHPClub
по функциям - в мануал
по остальному - читай внимательней ответы, "они проверяются на каждой "адниминистративной" странице третим скриптом" - бред.
 

begemot

Guest
Автор оригинала: Mr_Max
до сессий я ещё не дорос :(
Да там доростать нечего

а поподробнее можно?
Манул смотри

они проверяются на каждой "адниминистративной" странице третим скриптом (если не установлены, умный юзер решил не через логин зайти, а напрямую - то ему отлуп)
Это я понял. Для этого в сессиях и надо хранить данные
 

Verk

Guest
Автор оригинала: Mr_Max
а поподробнее можно?
Хранить в базе открытые пароли - плохая примета.
Хорошая примета - хранить в базе зашифрованные пароли.
Шифруют их вышеописанными функциями однонаправленного действия. Т.е. пароли шифруется и в зашифрованном виде хранится в базе. Когда пользователь передает свой пароль для проверки он опять-таки шифруется и результат шифрования сравнивается с тем что в базе. Если значения совпадают, то пользователь авторизуется.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
ребята а у кого есть нормальный русский ман? а то я в английском не очень....

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

tony2001

TeaM PHPClub
ха-ха.
русский ман.
насмешил.
русского мана НЕТ И НЕ БУДЕТ.
учи английский.
 

Larson

Новичок
Re: Проверьте плз. скрипт авторизации

Автор оригинала: Mr_Max

while($data=mysql_fetch_array($result))
{
if ($user==$data[user] and $pass==$data[pass])//если юзер и пароль из формы=юзерю и паролю из базы
{
setcookie ("user_", $data[user]);//установка кукисов
setcookie ("pass_", $data[pass]);
}
header ("Location: regional.php");//если все в порядке - редирект на страницу администрирования
exit;
}
Полная хренотень. Зачем делать while? У тебя что на некоторые логины записанны группы людей? Один логин - один чел.
PHP:
if (mysql_num_rows($result)!=1) { ... }
if(!($data=@mysql_fetch_array($result)))//если нулевой результат - редирект на логин
{header ("Location: login.html");
exit;
}
А сдесь у тебя будет всегда нулевой результат, т.к. из $result'a уже все выжато в предыдущем while.

А зачем два раза одно и тоже - if (isset($ok)) ? ипользуй else.
И вообще там еще дофига всякой дрибедени.
 

RomikChef

Guest
http:/faq.phpclub.net/ его спасет :)
а именно -
http:/faq.phpclub.net/docs

Макс, тебе имеет смысл писать в куку не логин и пароль, а просто некий признак того, что юзер авторизован.
а время жизни этой куки установить в 0, и она будет стираться бровзером по закрытии оного.
 

Макс

Старожил PHPClub
Э, Ромик, в куку писать признак?
Может ты спутал с сессиями?
 

RomikChef

Guest
Максим, сессии - те же куки, только малость подросшие, и возмужавшие :)
А что конкретно тебя в моем совете не устраивает?
 

RomikChef

Guest
Макс, вот тебе отредактированный скрипт.
PHP:
<?
require ("db.php");
if (isset($ok)) { //если нажата кнопка
  $sql="SELECT * from users WHERE user='$user' and pass='$pass'";//выборка из базы 
  $result = mysql_query($sql);
  $data=mysql_fetch_array($result);
  if ($user==$data['user'] and $pass==$data['pass']) { //если юзер и пароль из формы=юзерю и паролю из базы
    setcookie ("auth", 1); //установка кукисов
    header ("Location: regional.php"); //если все в порядке - редирект на страницу администрирования
    exit;
  } else {
    header ("Location: login.html");
    exit; 
  }
}
?> 
3. В каждом скрипте из административной части выполняется такая проверка: 
<?if (($_COOKIE['auth']<>1)) { //если не авторизован
  header ("Location: login.html");
  exit;
}
?>
Хотя, в общем-то, он особой секурности не обеспечивает, но, я думаю, тебе особая-то и не нужна.
 
Сверху