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

Автор: Topol Суббота, Август 11th, 2012 Нет комментариев

Рубрика: Perl

В статье описывается простейший способ реализовать авторизацию и аутентификацию средствами 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;

 

Заключение

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

Источник:  internet-technologies.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты