| Защита паролем | Previous Home Next |
| Статус в 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, позволяющим просматривать диски и каталоги на сервере и загружать файлы. Для разрешения доступа к дискам сервера программа требует ввода логина и пароля. (Не забудьте поменять логин/пароль в исходном коде!) |
| |