Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Защита паролем

01.01.2007

Защита паролем

Статус в HTTP-заголовке

В дополнение к строкам заголовка, которые формирует CGI-программа, сервер выводит дополнительную строку, в которой сообщает о статусе обработки полученного запроса. Например, если запрос обработан успешно, сервер выдает следующую строку в заголовке:

HTTP/1.0 200 OK

Запрос на авторизацию

Если вы попробуете запустить без изменений мой "web browser" (см. страницу delphi), то вы увидите, что полученный HTTP заголовок несколько отличается от обычного:

HTTP/1.0 401 Unauthorized

Content-type: text/html

WWW-Authenticate: Basic realm="/MyRealm"

 

<html><head><title>401 Unauthorized</title></head><body>

<h1>Для доступа к этой странице требуется пароль!</h1>

</body></html>

Здесь сервер отсылает предупреждение 401 Unauthorized для того, чтобы ваш браузер знал, что он обратился к защищенной странице. Тем самым, сервер предлагает вам ввести пароль и логин в строке уточнения (realm= "/MyRealm"). Если вы предоставите серверу действительный логин и пароль, то сервер откроет доступ к данной странице. В противном случае браузер будет получать вместо нужной страницы предупреждение с кодом 401.

 

Формируем запрос на авторизацию

Теперь мы знаем все, что нужно, чтобы наша CGI-программа могла запросить от пользователя пароль для доступа:

 Program CheckPWD;
 {$apptype console}
 begin
  WriteLn('HTTP/1.0 401 Unauthorized');
  WriteLn('Content-type: text/html');
  WriteLn('WWW-Authenticate: Basic realm="/Check"');
  WriteLn;
  WriteLn('Для доступа к этой странице требуется пароль!');
 end;
 

... и, к нашему удивлению, убеждаемся, что такой вариант не работает! Мы получаем либо внутреннюю ошибку сервера, либо браузер выдает полученный текст как обычную страницу, не понимая, что от него требуют ввести пароль!

Спокойно, без паники! Так и должно быть. Я уже говорил, что сервер автоматически дополняет HTTP-заголовок своими сообщениями, и браузер после выполнения программы CheckPWD получит следующее:

HTTP/1.0 200 OK

HTTP/1.0 401 Unauthorized

Content-type: text/html

WWW-Authenticate: Basic realm="/MyRealm"

 

Для доступа к этой странице требуется пароль!

Первая строка в заголовке говорит о том, что запрос обработан успешно (спасибо серверу). Поэтому браузер и не требует ничего от пользвателя.

У меня есть несколько вариантов выхода из этой ситуации, и один из вариантов заключается в том, что в соответствии с требованиями CGI, имя файла CGI-программы должно начинаться с "nph-", если она сама должна полностью формировать HTTP-заголовок.

 

Таким образом, достаточно переименовать вышеприведенную программу в "NPH-CHECKPWD.EXE", и все заработает!

 

Итак, мы добились, чтобы наша CGI-программа заставляла браузер потребовать от пользователя предоставить информацию об авторизации!

 

WWW-Authenticate

Получив запрос на авторизацию, браузер выводит на экран диалог для ввода пользователем логина и пароля и отправляет их на сервер в виде строки WWW-Authenticate: Basic realm="/MyRealm".

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

HTTP_AUTHORIZATION=Basic dXNlcjpwYXNzd29yZA==

В этой строке как раз и записан введенный логин и пароль, но только не в открытом, а в закодированном виде... Для кодировки строки авторизации используется формат Base64.

 

Сделаем небольшое отступление об основаниях систем счисления (как всегда - математика рулит!):

·Люди привыкли считать по основанию 10 (т.е. в 10-чной системе счисления): 0..9
·В информатике часто используется 16-ричное представление: 0..9,'A'..'F'
·В интернет очень широко используется представление в системе счисления с основанием 64: 0..9,'A'..'Z','a'..'z','+','/'
 

В файле LOGIN.ZIP вы найдете пример использования модуля Base64, который осуществляет кодирование и декодирование строк по основанию 64.

 

Кстати, вышеприведенный текст расшифровывается с помощью Base64 очень просто: "user:password"

 

Итак, теперь мы можем написать CGI-программу, которая будет либо показывать запрошенную информацию, либо требовать от пользователя авторизации.

Еще одной альтернативой является переадресация на другую страницу, если авторизация не подтверждена.

 

Практической реализацией изложенных выше принципов является программа login.

Не забудьте переименовать файлы login.exe и login.ini из этого в nph-login.exe и npg-login.ini !

 

В завершение я предлагаю вашему вниманию программу "CGI Web Browser". Эта программа является консольным приложением Delphi, позволяющим просматривать диски и каталоги на сервере и загружать файлы. Для разрешения доступа к дискам сервера программа требует ввода логина и пароля. (Не забудьте поменять логин/пароль в исходном коде!)