Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация и сессия, как лучше? 
:(
    Опции темы
Мартын Яуза
Дата 5.5.2003, 18:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Проблема такая.
Надо что бы админы. Т.е. те кому я дам пароли(каждому свой) заходили в админ-зону. Я скачал скрипт постинга новостей и изучил его, с целью получить ответ, как лучше сделать систему авторизации. Тут встретились следующие проблемы.

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

open (AUTH, ">Data/auth.pl");
print AUTH '$auth = 1;';
print AUTH "1;";
close AUTH;
Создается файл и туда пишется $auth=1;
А потом зачем то еще одна единица.

Вопрос: Зачем еще одна единица?

И во время сессии этот файл остается неизменным, а лишь перед каждым действием проверяется, что $auth=1.
Но раз так, то любой посторонний во время сессии админа, когда файл auth существует, может подать запрос примерно такой:

act=admin&code=show

Программа проверяет auth.pl, возвращается истина и посторонний получает доступ к центру администрации.

Не лучше ли во время сессии просто держать переменную авторизации в самой программе?

В том скрипте, когда нажимаем кнопку ВЫХОД из центра администрации, то файл auth.pl удаляется, соответственно переменные авторизации очищаются. Но что если кто то не нажмет на кнопку ВЫХОД, а просто закроет браузер? Переменные остаются и любой желающий спокойно получает доступ к администрации.

По этому у меня следующие вопросы:

1) Как лучше вести сессию? Держать ли переменную авторизации во время сессии в программе или же как то еще?

2) Как лучше осуществить выход из сессии? Помоему если держать переменную в программе, то всё будет как надо. Если есть кое что по лучше напишите.

  Вверх
HalkaR
Дата 5.5.2003, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: нет
Всего: 42



Лично я, коли надо делать чтолибо подобное делаю самое простое и дурацкое, что возможно в скрипте делаю скрытую форму в которую заносится введенный при авторизации пароль и предаю их как параметр и каждый раз проверяю.
PM MAIL   Вверх
acp
Дата 5.5.2003, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

Репутация: нет
Всего: 2



Цитата
делаю скрытую форму в которую заносится введенный при авторизации пароль


Кхе-кхе... Мда... smile.gif

Самое лучшее:
1. URL rewriting. Это когда к ссылкам прибавляется уникальный сгенерированный идентификатор сессии.
2. Cookies. Идентификатор хранится там.

В обоих случаях нужны идентификаторы. Их можно хранить на сервере либо в виде файлов, либо в БД. И будет существовать парсер, который будет при вызове какого-либо скрипта проверять, существуют ли устаревшие идентификаторы.
PM WWW ICQ   Вверх
Мартын
Дата 6.5.2003, 09:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Что за идентификаторы? я новичок просто. Можно по подробнее?
  Вверх
acp
Дата 6.5.2003, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

Репутация: нет
Всего: 2



Ну, для каждого пользователя, при авторизации, т.е. когда он вводит логин/пароль скрипт генерирует некий уникальный идентификатор и передаёт его пользователю указанными выше способами. А идентификатор, что-то типа
Код

do
 $R = int(rand(999));
while(<а тут проверка условия на существование аналогичного>);


Конечно, такой способ не идеален, т.к. может зациклиться надолго.
PM WWW ICQ   Вверх
Unregistered
Дата 6.5.2003, 12:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Проще- воспользоваться стандартным средством apacha - .htaccess.
Куки хранятся на стороне клиента - их легко подделать.
Через "скрытые формочки" передавать данные заморочно, т.к. все переходы придется организовывать через кнопку Submit
Есть вариант такой. После успешной регистрации - генерится некое загадочное число (цифр 12), чей состав подчинен опред.правилам. И это число подставляешь во все ссылки генерированной страницы (print "<a href=newpage.pl?uid=$number>..</a>)
И при запуске каждого скрипта проверяеш валидность переданной переменной "uid".
  Вверх
acp
Дата 6.5.2003, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

Репутация: нет
Всего: 2



А это "некоторое загадочное число", разве не идентификатор сессии? :-)
PM WWW ICQ   Вверх
Мартын
Дата 6.5.2003, 18:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











На сколько я понял всё выглядит так:

Сессия начинается с выдачи сгенерированного идентификатора. Он добавляется в каждую ссылку.
Но как проверить, что именно ЭТОТ идентификатор - то что надо?

Может создать файл, куда сунется тот самый идентификатор. И при запросе он будет сверяться с тем, что пытается послать юзер из своего браузера. Если они идентичны - то всё ОК.

НО если файл был создан более 5 минут назад, то надо пройти авторизацию заново.

Такой вариант сойдет за безопасный?
  Вверх
acp
Дата 6.5.2003, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

Репутация: нет
Всего: 2



Цитата
Такой вариант сойдет за безопасный?

Если к этим файлам нет доступа из сети, если этот уникальный идентификатор сессии достаточно длинный (!) и рандомный, то да.
PM WWW ICQ   Вверх
Мартын
Дата 7.5.2003, 11:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В таком случае какие права доступа лучше всего поставить на этот пятиминутный файл?
  Вверх
Guest_test
Дата 7.5.2003, 12:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Данные о разрешенных пользователях должны хранится или в БД или в файле находящемся за пределами http-зоны (т.е. чтобы нельзя было его прочитать из броузера)
Права на чтение для apache (или nobody)
cgi Скрипт берет введенные в формочку login/password - сверяет с этим файлом, и если OK -
генерит идентификатор который добавляет ко всем ссылкам. При загрузке ссылки проверяет наличие корректного идентификатора.
идентификатор:
Придумываешь некое число, напр. 5057. Далее придумываешь правила его зашифровки:
Напр. над переданном идентификотором (123456732569) производятся следующие действия - берется 2 цифра складывается с 8-й, а 3-я * 9-ю
полученные результаты объединяешь -добавляешь еще что-нибудь - и получаешь 5057.
Значит усе корректно.




  Вверх
Мартын
Дата 7.5.2003, 23:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Но тогда идентификатор всегда один и тот же. И если он будет в каждой ссылке, то соответственно и в кукисах. А если кукисы каким то загадочным образом попадут на чужой комп...
  Вверх
secandr
Дата 27.6.2003, 22:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Можно сделать следующее:

сессию выдовать при входе, например - время с начала эпохи. Я ещё вычитал асц коды букв логина, рандом,....
$ses=time;

Затем переменная сессии записывается в файл в виде:
12345~45678~436657
Потом читаешь этот файл в $str
@uin=split(/~/,$str);
foreach $t(@uin)
{
проверка на устаревание идентификатора, из не устаревших генирируешь @out
проверка на совпадение.
}
Сохраняешь в файл @out в файл.

В более сложном варианте в файле можно хранить имя-номер_сессии-время_последнего_обращения.
  Вверх
NightGoblin
Дата 7.7.2003, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



Хм... Можно сделать логины и пароли, если админов много. Но если речь идет о чем-нибудь достаточно простом, типа администрирования небольшого сайта, просто сделать файл вне каталога с публичными документами (права хоть 0666), в который будут писаться строчки типа:

n7GwoMfbzRH06Ce:1057550523

где до двоеточия располагается ключ, предоставляющий права админа, а после - время окончания действия в формате UNIX (в Perl текущее время в этом формате получается с помощью функции time() ). Каждый раз, если в GET или POST запросе присутствует id=(что-то), то читается файл, ключи проверяются на устарение, устаревшие удаляются, данный id сравнивается со всеми ключами, и, если совпадает, клиенту предоставляется доступ, а время окончания действия обновляется по принципу текущее время плюс некое время t, за которое админ должен произвести следующий запрос.

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

Можно, конечно, включить в дело SQL, но стоит ли оно того?... smile.gif

ЗЫ: А функция для генерации ключей может быть, например, такой:
Код

sub genkey {
   my ($i, $t);
   $t = '';

   for ($i = 0; $i < 32; $i++) {
       unless (rand(2) > 1.5) {
           $t .= chr (int (rand (26)) + 65 + int (rand (2)) * 32);
       } else {
           $t .= int (rand (10));
       }
   }
   return ($t);
}

Хотя, конечно, можно было бы сделать и оптимальнее, но это всего лишь один из вариантов smile.gif

Это сообщение отредактировал(а) NightGoblin - 7.7.2003, 07:16


--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0916 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.