В статье описывается простейший способ реализовать авторизацию и аутентификацию средствами perl не используя cookie.
Введение
Авторизация - предоставление определенных полномочий лицу или группе лиц на выполнение некоторых действий в системе обработки данных. Посредством авторизации устанавливаются и реализуются права доступа к ресурсам.
Аутентификация - процедура проверки подлинности данных и субъектов информационного взаимодействия исключительно на основе внутренней структуры самих данных.
То бишь, авторизация происходит при обработке введённого пароля, а аутентификация - при дальнейшей работе пользователя.
Теория
Как бы ни хранился пароль, он должен быть нечитаем даже для того, кто может получить доступ к файлу, в котором хранится пароль.
Аутентификация должна проходить так, чтобы аутентификационными данными возможно было воспользоваться только с того компьютера, с которого происходила авторизация.
Ещё лучше, если при аутентификации учитываются данные не только идентифицирующие определённый компьютер, но и броузер.
Также неплохо реализовать привязку к сессии
К делу
Для начала нужно определиться, какие данные будут использоваться при аутентификации. для примера возьмём следующие переменные окружения: REMOTE_ADDR, HTTP_USER_AGENT, HTTP_ACCEPT_LANGUAGE (также на http://www.bugtraq.ru/forum/ посоветовали использовать HTTP_X_FORWARDED_FOR).
Чтобы получить значение какой-либо переменной окружения средствами perl, используется функция $ENV{}. например $ENV{REMOTE_ADDR} при локальном запуске будет равно 127.0.0.1.
Теперь можно определиться с тем, как и где будет храниться пароль. пароль лучше всего необратимо шифровать, то бишь шифровать самим собой. для примера будем хранить пароли в файле, имеющем такое же имя, как и логин. также заранее определимся о максимальной длине логина и пароля. опять же, для примера, будем использовать 16 и 12 соответственно.
Пишем модуль авторизации:
#usr/bin/perl
print "Content-type: text/htmlnnn";
#получаем данные авторизации (они должны были отправляться из формы авторизации) read(STDIN, $buffer, $ENV{"CONTENT_LENGTH"}); @pairz = split(/&/, $buffer); $a= 0; foreach $pair (@pairz) { $pair =~ tr/+/ /; $pair =~ s/&/&/gi; $pair =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; @pairz[$a]= $pair; $a++; }
#передаём данные для авторизации в массив login #обрезая имена переменных (в данном случае- login и pass) @login[0]= substr(@pairz[0], 6, 24); @login[1]= substr(@pairz[1], 5, 32);
#проверяем валидность пары логин/пароль #если файл с паролем существует и пароль валиден- выдаём уровень доступа if (open $pw, join("", "pws/", @login[0], ".pw") { if (crypt(@login[1], @login[1]) eq <$w>) { @g3tz= ($ENV{"REMOTE_ADDR"}, $ENV{"HTTP_USER_AGENT"}, $ENV{"HTTP_ACCEPT_LANGUAGE"}); foreach $g3tz (@g3tz) { foreach $cr (split("", $g3tz)) { $auth0z+= ord($cr); } } $AL= 1; #тут переадресуем на страницу с положительным результатом авторизации (и передаём crypt($auth0z, $pass)) } else { $AL= 0; #переадресуем на страницу с отрицательным результатом авторизации } }
Как видно, всё очень просто :)
Переходим к аутентификации. хеш можно передавать простым GETом, т.е. параметром в адресной строке. к примеру, он будет храниться в переменной auth вместе с логином вида [auth=login:hash]. модуль аутентификации будет подключаться при работе пользователя и записывать в переменную $AL значение 1 (авторизован) или 0 (неавторизован). в зависимости от этого будут работать остальные скрипты. (подключать скрипты можно используя функцию require())
Это простейший пример реализации авторизации и аутентификации (ции, млин :) ), исходя из которого можно сотворить просто шедевр. подключить привязку к сессии, привязку ко времени итдитп. конечно, существует довольно таки много способов реализовать описанное выше, но я остановился на этом.