• Введение авторизация- предоставление определенных полномочий лицу или группе лиц на выполнение некоторых действий в системе обработки данных. Посредством авторизации устанавливаются и реализуются права доступа к ресурсам. аутентификация- процедура проверки подлинности данных и субъектов информационного взаимодействия исключительно на основе внутренней структуры самих данных. то бишь, авторизация происходит при обработке введённого пароля, а аутентификация - при дальнейшей работе пользователя. • Теория 0. как бы ни хранился пароль, он должен быть нечитаем даже для того, кто может получить доступ к файлу, в котором хранится пароль. 1.0. аутентификация должна проходить так, чтобы аутентификационными данными возможно было воспользоваться только с того компьютера, с которого происходила авторизация. 1.1. ещё лучше, если при аутентификации учитываются данные не только идентифицирующие определённый компьютер, но и броузер. 1.2. также неплохо реализовать привязку к сессии • К делу 0.0. для начала нужно определиться, какие данные будут использоваться при аутентификации. для примера возьмём следующие переменные окружения: REMOTE_ADDR, HTTP_USER_AGENT, HTTP_ACCEPT_LANGUAGE (также на форуме bugtraq посоветовали использовать HTTP_X_FORWARDED_FOR). чтобы получить значение какой-либо переменной окружения средствами perl, используется функция $ENV{}. например $ENV{"REMOTE_ADDR"} при локальном запуске будет равно "127.0.0.1". 0.1.0. теперь можно определиться с тем, как и где будет храниться пароль. пароль лучше всего необратимо шифровать, то бишь шифровать самим собой. для примера будем хранить пароли в файле, имеющем такое же имя, как и логин. также заранее определимся о максимальной длине логина и пароля. опять же, для примера, будем использовать 16 и 12 соответственно. 0.1.1. пишем модуль авторизации: #usr/bin/perl print "Content-type: text/html "; #получаем данные авторизации (они должны были отправляться из формы авторизации) 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 ) { @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; #переадресуем на страницу с отрицательным результатом авторизации } } как видно, всё очень просто :). 0.2.0. переходим к аутентификации. хеш можно передавать простым GET'ом, т.е. параметром в адресной строке. к примеру, он будет храниться в переменной auth вместе с логином вида [auth=login:hash]. модуль аутентификации будет подключаться при работе пользователя и записывать в переменную $AL значение 1 (авторизован) или 0 (неавторизован). в зависимости от этого будут работать остальные скрипты. (поделючать скрипты можно используя функцию require()) 0.2.1. пишем модуль аутентификации. #!/usr/bin/perl @pairs = split(/:/, $auth); if (open $a, join("", $ENV{"DOCUMENT_ROOT"}, "/cgi-bin/pws/", @pairs[0], ".auth")) { $pass= ; 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; • Заключение это простейший пример реализации авторизации и аутентификации (ции, млин :) ), исходя из которого можно сотворить просто "шедевр". подключить привязку к сессии, привязку ко времени итдитп. конечно, существует довольно таки много способов реализовать описанное выше, но я остановился на этом.
|