Авторизация и аутентификация без куки

В статье описывается простейший способ реализовать авторизацию и аутентификацию средствами perl не используя cookie.

Введение

Авторизация - предоставление определенных полномочий лицу или группе лиц на выполнение некоторых действий в системе обработки данных. Посредством авторизации устанавливаются и реализуются права доступа к ресурсам.

Аутентификация - процедура проверки подлинности данных и субъектов информационного взаимодействия исключительно на основе внутренней структуры самих данных.

То бишь, авторизация происходит при обработке введённого пароля, а аутентификация - при дальнейшей работе пользователя.

Теория

  1. Как бы ни хранился пароль, он должен быть нечитаем даже для того, кто может получить доступ к файлу, в котором хранится пароль.
  2. Аутентификация должна проходить так, чтобы аутентификационными данными возможно было воспользоваться только с того компьютера, с которого происходила авторизация.
  3. Ещё лучше, если при аутентификации учитываются данные не только идентифицирующие определённый компьютер, но и броузер.
  4. Также неплохо реализовать привязку к сессии

К делу

Для начала нужно определиться, какие данные будут использоваться при аутентификации.
для примера возьмём следующие переменные окружения: 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())

Пишем модуль аутентификации.

#!/usr/bin/perl

@pairs = split(/:/, $auth);
if (open $a, join("", $ENV{"DOCUMENT_ROOT"}, "/cgi-bin/pws/", @pairs[0], ".auth"))
{
$pass= <$a>;
close $a;
@g3tz= ($ENV{"REMOTE_ADDR"}, $ENV{"HTTP_USER_AGENT"}, $ENV{"HTTP_ACCEPT_LANGUAGE"});
foreach $g3tz (@g3tz)
{
foreach $p1 (split("", $g3tz))
{
$auth0z+= ord($p1);
}
}
if (crypt(@pairs[1], @pairs[1]) eq crypt($auth0z, $pass))
{
$AL= 1;
} else
{
$AL= 0;
}
} else
{
$AL= 0;
}

return true;

Заключение

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

05 апреля 2005 в 21:56
Материалы по теме
{"url":"http://www.fastvps.ru/", "src":"/images/advbanners/fastvps.png", "alt":"Хостинг Fastvps.ru. Наш выбор!"}
Заработок