[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Web - программирование / 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;

Заключение


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





Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Web - программирование / PERL /

CGI интерфейс
24-10-2009   

Большое количество World Wide Web приложений основано на использовании внешних программ, управляемых Web сервером... подробнее

Кол. просмотров: общее - 5805 сегодня - 1

Upload File
24-10-2009   
Кол. просмотров: общее - 4898 сегодня - 1

Программирование для Веб: Загрузка файлов на сервер и посылка e-mail с вложениями
24-10-2009   

Одним из популярнейших вопросов во всевозможных форумах является вопрос «Как загрузить файл на сервер?». А ведь на самом деле это не так сложно, как кажется на первый взгляд. И чтобы не было совсем легко – пусть скрипт, который приведен ниже еще и посылает этот файл по почте, в виде вложения... подробнее

Кол. просмотров: общее - 5316 сегодня - 1

Защита WWW-сценариев от несанкционированного копирования и модификации
24-10-2009   

В статье рассматривается один из основных подходов к генерации динамического контента в среде веб-приложений, а именно использование веб-сценариев и CGI, и применительно к ним, методы защиты исходных текстов от несанкционированного копирования и модификации... подробнее

Кол. просмотров: общее - 5005 сегодня - 0

Как защитить мою программу, чтобы никто не смог её прочитать?
20-10-2009   

Disclaimer: все приведённые примеры предназначены для демонстрации принципов, а вовсе не являются готовыми к использованию решениями... подробнее

Кол. просмотров: общее - 5042 сегодня - 1



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects