Автор Тема: Авторизация и куки. Нужны советы...  (Прочитано 9980 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kwazar

  • Философ
  • Постоялец
  • ***
  • Сообщений: 201
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.uhuhu.ru/
Авторизация и куки. Нужны советы...
« : 13 Февраля 2003, 13:28:09 »
Сделал систему увторизации. проблемма в том - что она подрузомевает 3 рода прав и огромное количество (более 10 000) пользователей.

Пожалуйства проверте этот скрипт на вломоустоичивость, подскажите, может стоит что-то изменить?
Вот код:
sub aut {
########получаем куки
@cookies = split (/\\; /,$ENV{HTTP_COOKIE});
foreach $cookies (@cookies)
{
   ($n, $value) = split(/=/, $cookies);
   $n =~ tr/+/ /;
   $n =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $COOK{$n} = $value;
}

# Есть какие-то данные, сверяем их, если пользователь не авторизуется
if ($COOK{login} ne \'\' && $COOK{sess} ne \'\' && $act ne "login")
{
   $login="$COOK{login}";
   $sess="$COOK{sess}";
   &sess;

}

# Пользователь не авторизован вообще и не авторизуется в данный момент
if (($COOK{login} eq \'\' || $COOK{sess} eq \'\') && $act  ne "login")
{
   &form_login;
   exit;
}
# Пользователь авторизуется
if ($act eq "login")
{
   &login;
$act="";
}
}
sub login
{

   $sth = $dbh->prepare("select id,status from $users_table WHERE login = \'$login\' and pass = \'$pass\'");
   $sth->execute || die $dbh->errstr;
   @rez=$sth->fetchrow;
   ### Логин или пароль не верны!
   $stat="$rez[1]";
   if ($stat eq \'\')
   {
      print "Content-type:text/html\\n\\n";
      &form_login;
      exit;
   }
   # Пользователь авторизован
   if ($stat ne \'\')
   {
      &wr_cookes;
   }

}
### Генерируем и пишем данные пользователя в куки и заносим их в базу
sub wr_cookes
{
   $sess=rand(32);
   print "Set-Cookie: login=$login; expires=now;\\n";
   print "Set-Cookie: sess=$sess; expires=now;\\n";
   $sth = $dbh->prepare("update $users_table set sess=\'$sess\' where login=\'$login\'");
   $sth->execute || die $dbh->errstr;                                                    
   $sth->finish;
}
sub sess
{

   $sth = $dbh->prepare("select id,status,sess from $users_table WHERE login = \'$login\' and sess = \'$sess\'");
   $sth->execute || die $dbh->errstr;
   @rez=$sth->fetchrow;
   $stat="$rez[1]";
   ### Логин или пароль не верны!
   if ($stat eq \'\')
   {
      &form_login;
      exit;
   }
   # Пользователь авторизован
   if ($stat ne \'\')
   {
      &wr_cookes;
   }

}
Далее идет код скрипта, которому передается переменная $stat - статус пользователя.
Еще меня интересует скорость отработки...
И еще. Как мне поставить куки на 20 минут с текущего положения? Хочу сесси сделать. Плюс, как сделаь так, что бы они будуи доступны со всего доменного имени, а не только с текущего скрипта. Заренее спасибо.
С уважением Сергей

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
Авторизация и куки. Нужны советы...
« Ответ #1 : 13 Февраля 2003, 19:36:31 »
Цитировать
куки на 20 минут с текущего положения

print "Set-Cookie: login=$login; expires=+20m;\\n";
Цитировать
как сделаь так, что бы они будуи доступны со всего доменного имени, а не только с текущего скрипта

непонятен вопрос
Все болезни от нервов, только сифилис от удовольствия

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Авторизация и куки. Нужны советы...
« Ответ #2 : 13 Февраля 2003, 20:16:41 »
Цитировать
непонятен вопрос

-domain  =>  \'.capricorn.com\',
-path    =>  \'/cgi-bin/database\'
perldoc CGI::Cookie
The documentations is your friend

Оффлайн Kwazar

  • Философ
  • Постоялец
  • ***
  • Сообщений: 201
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.uhuhu.ru/
Авторизация и куки. Нужны советы...
« Ответ #3 : 14 Февраля 2003, 08:06:50 »
А насчет самого метода авторизации, что скажите? Нужно ли динамически каждый раз генерировать $sess, может отрывать ее на одим сеанс и все, без перезаписи при каждом обращении?
Цитировать
непонятен вопрос

Я имел ввиду - при моем методе записи кукей, как я полагаю, ставится разрешение на чтение их только с текущего скрипта. А если на одном доменном имени отрабатывают несколько скриптов, которые используют эту авторизацию (в моем случае - чат, форум, гостевая, внутренняя почта, администрирование...). Нужно, что бы для них чтение этих кукей было разрешенно...
Для этого достаточно написать:
print "Set-Cookie: login=$login; expires=+20m; path=/; domain=$ENV{\'HTTP_HOST\'};\\n";

???
Заранее спасибо.
« Последнее редактирование: 14 Февраля 2003, 10:47:48 от Kwazar »
С уважением Сергей

Оффлайн Alone

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 182
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Авторизация и куки. Нужны советы...
« Ответ #4 : 14 Февраля 2003, 09:35:26 »
IMHO cookie ставятся только для текущего доменного имени, исключение зделано для *.mydomain.ru и возможно выше
cookie поставить можно с любого места (см. выше)  а получить только для текущего
т.е. скрипты с /cgi-bin/s1/ не смогут получить с /cgi-bin/s2/ или / но это IMHO

Оффлайн Kwazar

  • Философ
  • Постоялец
  • ***
  • Сообщений: 201
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.uhuhu.ru/
Авторизация и куки. Нужны советы...
« Ответ #5 : 14 Февраля 2003, 10:30:53 »
Alone, да ну... Должно же быть разрешенно получать со всего доменного имени? Вспомним тот же PHP-Nuke, куча скриптов, на одной системе авторизации - кукях и все их получают...
С уважением Сергей

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
Авторизация и куки. Нужны советы...
« Ответ #6 : 14 Февраля 2003, 12:28:09 »
NeoNox вопрос вроде понял и на него ответил, причем довольно развернуто.
Все болезни от нервов, только сифилис от удовольствия

Оффлайн Kwazar

  • Философ
  • Постоялец
  • ***
  • Сообщений: 201
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.uhuhu.ru/
Авторизация и куки. Нужны советы...
« Ответ #7 : 14 Февраля 2003, 14:11:23 »
У нас подсоляркой perldoc не установлен.
С уважением Сергей

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Авторизация и куки. Нужны советы...
« Ответ #8 : 14 Февраля 2003, 14:12:34 »
The documentations is your friend

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Авторизация и куки. Нужны советы...
« Ответ #9 : 14 Февраля 2003, 14:14:50 »
Цитировать
Для этого достаточно написать?

Да достаточно. Главное, что-бы другие скрипты "понимали" эти куки.
The documentations is your friend

Оффлайн Kwazar

  • Философ
  • Постоялец
  • ***
  • Сообщений: 201
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.uhuhu.ru/
Авторизация и куки. Нужны советы...
« Ответ #10 : 14 Февраля 2003, 16:07:27 »
Они поймут. Этот модуль используют все скрипты.
Кастати, по самому алгоритму авторизациии что скажите? Ошибки, дыры, ...?
С уважением Сергей

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Авторизация и куки. Нужны советы...
« Ответ #11 : 14 Февраля 2003, 16:21:42 »
Я бы посоветовал использовать Apache::Session вместо rand(32);
http://www.perldoc.com/cpan/Apache/Session.html
Неплохо бы было рассмотреть режим сессий при отключеных куках
А так на первый взгляд все Ок!
The documentations is your friend

Оффлайн Kwazar

  • Философ
  • Постоялец
  • ***
  • Сообщений: 201
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.uhuhu.ru/
Авторизация и куки. Нужны советы...
« Ответ #12 : 14 Февраля 2003, 17:47:33 »
NeoNox, режим сессия расмотреть было бы не плохо, но первое и единственное, что мне приходит в голову - это проверка по ip, однако усли учесть то, что есть такие вещи, как прокси, корорые скрывают реальный ip, то в итоге получается не хорошо. Да и поломать будет просто, если проще.
Базовая авторизация тоже не подходит - в файле хасвор будет слишком много записей. По записи на кождого пользователя. Вот если бы вместо его можно было прикрутить базу...
За ссылку спасибо - с удовольствием сейчас почитаю.
С уважением Сергей

Оффлайн Vladn

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://mod-site.net/ru/
Авторизация и куки. Нужны советы...
« Ответ #13 : 22 Февраля 2004, 00:00:33 »
Если я не ошибаюсь, то исходный скрипт можно взломать.
Поясняю:
Допустим, я знаю, что в системе зарегистрирован пользователь Vasya. Я запускаю локальный сервер, устанавливаю в браузере для нужного сайта следующие Cookies:
login=Vasya\' OR (login=\'lalala
sess=\') OR login=\'lalala

Далее я выключаю локальный сервер и захожу на реальный.
В результате запустится функция sess(), которая выполнит следующий запрос:
select id,status,sess from TABLE_NAME WHERE login = \'Vasya\' OR (login=\'lalala\' and sess = \'\') OR login=\'lalala\'

В результате скрипт признает меня Васей, хотя я на самом деле не Вася. Вот так то.

Решения:
1) Нужно проверять все значения, полученные от пользователя, в том числе Cookies. Если известно, что имя состоит из букв, цифр и \'_\', а номер сессии - только из цифр, то следует добавить:
$login=~s/\\W//g;
$sess=~s/\\D//g;
2) Вместо $sth = $dbh->prepare("select id,status,sess from $users_table WHERE login = \'$login\' and sess = \'$sess\'");
$sth->execute || die $dbh->errstr;
используй $sth = $dbh->prepare("select id,status,sess from $users_table WHERE login = ? and sess = ?");
$sth->execute($login, $sess) || die $dbh->errstr;

Поможет даже без пункта 1
3) Думай как хакер. Врага нужно знать.

2ALL: Есть повод задуматься над собственными скриптами.
« Последнее редактирование: 22 Февраля 2004, 00:11:38 от Vladn »
 - мои гостевушки MBook

Оффлайн metton

  • access granted
  • Старожил
  • ****
  • Сообщений: 320
  • +0/-0
  • 2
    • Просмотр профиля
    • http://bluejack.ru/
Авторизация и куки. Нужны советы...
« Ответ #14 : 22 Февраля 2004, 22:01:22 »
Vladn
И как же ты собираешься устанавливать "в браузере для нужного сайта следующие Cookies"?
 BlueJacking среди нас

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28