[ Alex WebKnacKer ] Хакинг и антихакинг - защита и нападение. Книги удк 004. 056. 5Alex WebKnacKer
Скачать 42.38 Mb.
|
• Тогда сервер вызовет шлюз с помощью такой командной строки. /text/template/ Здесь запись / означает физический (т.е. по каталогам сервера) путь к программе-сценарию. Как видим, первым аргументом командной строки будет запись /text/template/. Эта запись передается шлюзу, после чего он может предпринять какие-либо действия, в зависимости от самого сценария (скажем, использовать какой-либо шаблон документа в указанном записью месте). Пусть теперь адрес URL запроса будет следующим. Тогда сервер вызовет шлюз с помощью такой командной строки. Здесь на месте первого аргумента указан пропуск. Перечислим список переменных окружения, устанавливаемых сервером для запускаемых шлюзов CGI, независимо от типа запроса. 326 Быстро легко. и Антихакинг • - название и версия информационного сервера, который отвечает на запрос и запускает шлюз. Формат переменной таков: имя/версия. Например, эта переменная может иметь такое значение: • - имя Web-сервера, представленное либо в виде DNS-имени, либо в виде IP-адреса (это имя должно совпадать с переданным в запросе адресом Эта информация может оказаться полезной для генерации в программе шлюза адресов данного сервера. Вот пример значения этой переменной: • - версия спецификации CGI, использованной на мо- мент, когда компилировался сервер. Формат переменной таков: Вот пример значения этой переменной: Перечисленные выше переменные окружения являются специфичными для разных запросов и заполняются перед запуском шлюза. А теперь приведем необязательные переменные окружения шлюзов CGI. • - имя и версия информационного протокола, использо- ванного в полученном запросе. Формат переменной таков: протокол/версия. Например, эта переменная может иметь такое значение: • - номер порта, на который был послан запрос, например, 80. • - метод, который был использован для запроса. Для запро- сов HTTP эти методы перечислены в Приложении С. • - дополнительная информация о пути, которую клиентский браузер поместил в конец адреса запроса сценария. Например, если указанный в запросе адрес имеет вид то требуемый сценарий называется handler.exe, а в переменную будет помещено значение "text/dot". Другими словами, доступ к шлюзу может быть осуществлен по виртуальному пути, за которым следует некоторая дополнительная информация. Эта информация и передается в • - эта переменная поддерживается лишь отдельными серверами и содержит физический путь к программе-сценарию, полученный преобразованием виртуального пути в адресе запроса. Например, пусть абсолютный физический адрес к корневому каталогу Web-сервера будет Предположим также, что каталог cgi-bin со сценариями находится на первом уровне корневого каталога сервера, т.е. для обращения к нему следует использовать такой виртуальный путь: Тогда адрес запроса сценария сервер преобразует в такое значение т.е. Приложение В 327 виртуальный адрес превращается в физический путь к программе шлюза, составленного согласно файловой системе сервера. • - виртуальный путь к шлюзу, который должен выполняться для данного запроса. Это значение можно для получения в программе шлюза адреса (с целью, например, отправки его обратно клиентскому браузеру вместе с ответным документом HTML, после чего браузер может применять этот адрес для повторных вызовов шлюза). Вот пример значения этой переменной: • - информация, следующая за символом в адресе переданного в строке HTTP-запроса данного Она не должна быть декодирована никоим образом. Вне зависимости от командной строки эта переменная окружения всегда должна быть установлена при наличии соответствующей информации. Например, пусть полученный в запросе адрес будет таков: Тогда в переменную будет помещено такое значение: • - имя клиентского компьютера, с которого получен запрос. Если сервер не имеет такой информации, он должен установить переменную а это поле оставить пустым. • - IP-адрес клиентского компьютера, с которого получен данный запрос. Например: 199.23.155.34. • - если сервер поддерживает идентификацию пользователей и шлюз является защищенным от постороннего доступа, этот специфичный для протокола метод идентификации используется для проверки пользователя. Для доступа по протоколу HTTP 1.1 значения этой переменной определены в документе Переменная может быть равной или так называемой схеме идентификации HTTP (например, "challenge"), или равна NULL. • - используется в случае, когда применяется идентификация пользователей (аналогично предыдущему случаю) для хранения имени поль- зователя. - если HTTP-сервер поддерживает идентификацию пользо- вателя согласно спецификации то эта переменная будет содержать имя пользователя, полученное от сервера. Эта информация практически бес- полезна, поскольку пользователи могут указать для нее любое значение. • - для запросов, которые содержат передаваемую на сервер информацию, типа запросов POST и PUT протокола HTTP, здесь со- держится этой информации, например, 328 Быстро легко. и Антихакинг • - объем данных, которые передает клиент. Если запрос включает информацию, переданную по методу POST, этой переменной при- сваивается значение, равное числу байтов данных во входном потоке шлюза обработки данных. • НТТР_АССЕРТ - список типов содержимого которые может обрабатывать клиентский браузер. Этот список поступает от самого клиентского браузера. Каждый тип содержимого в этом списке должен быть отделен запятой согласно спецификации HTTP. Формат этой переменной таков: тип/подтип, тип/подтип... Вот пример такого списка: • - имя клиентского браузера, пославшего данный запрос. Общий формат переменной таков: Вот пример значения этой переменной: Вывод После обработки полученных данных шлюз выводит результаты в стандартный поток вывода STDOUT, который определяется для каждой запущенной программы одновременно с потоком ввода. Содержимое этого вывода может представлять собой или документ HTML, сгенерированный шлюзом, или директиву серверу, указывающую, ему следует получить необходимый документ HTML. Как правило, шлюз сам выполняет вывод и пересылку результатов обратно клиенту, не прибегая к услугам сервера. Преимущество этого подхода состоит в том, что шлюз не должен посылать полный заголовок HTTP на каждый запрос. Чтобы отличить такие шлюзы от остальных, спецификация CGI требует, чтобы их имена начинались с префикса В этом случае на шлюзе лежит ответственность за возвращение клиенту синтаксически правильного ответа. Таким образом, вывод результатов шлюзом выполняется двумя способами: вы- вод, контролируемый сервером, и вывод, неконтролируемый сервером. сервером Для вывода шлюзом CGI результатов обработки данных контролируемым сервером способом, их следует отправить в поток вывода результатов обработки и завершить исполнение программы. Выводимые шлюзом данные должны начинаться с заголовка, содержащего текстовые строки с тем же самым форматом, что и заголовки HTTP, и завершаться строкой, содержащей символ CRLF. Любые строки заголовков, не являющиеся директивами серверу, посы- лаются непосредственно клиенту. Спецификация CGI определяет три директивы сервера. • Content-type - указывает тип содержимого возвращаемых данных. Приложение В 329 • Location - Эта директива используется в случае, когда необходимо указать серверу, что возвращается не сам документ, а ссылка на него. Если аргу- ментом директивы является адрес URL, то сервер передаст клиенту указание на перенаправление запроса. Если аргумент представляет собой виртуальный путь, сервер вернет клиенту заданный этим путем документ, как если бы клиент запрашивал его непосредственно. Status - Эта директива используется для указания серверу HTTP строки состояния, которую он должен переслать клиенту. Формат строки таков: ххххх, где - это код состояния, состоящий из трех цифр, а ххххх - текстовая строка с пояснением кода состояния, например, такая: Forbidden (Запрещено). Приведем примеры использования этих директив. Предположим, что имеется некоторая программа-сценарий, преобразующая текстовые данные в документ HTML. Когда сценарий заканчивает свою работу, он должен произвести следую- щий вывод в стандартный выходной поток. вывода text/html вывода Далее приведена простейшая программа на языке С, которая в ответ на запрос формы, приведенной в разделе «Передача данных шлюзам» выше, отображает на экране клиентского браузера поздравление пользователю. int argc, char { printf ( ) с Вашим printf ; } Эта программа не делает никакой обработки — она просто передает в выходной поток строки с тегами HTML, используя библиотечную функцию printf () языка С. Сервер обрабатывает выходной поток и формирует корректное ответ- ное сообщение HTTP, передаваемое клиентскому браузеру. Теперь рассмотрим шлюз, который в определенных случаях должен отсылать клиентскому браузеру документ anydoc.txt, хранимый в каталоге данного сервера. При этом он действует так, как если бы этот документ был непосредственно запрошен клиентским браузером с помощью ссылки на адрес В этом случае, вывод шлюза будет таков. 330 Быстро легко. Хакинг и Антихакинг вывода Location: вывода Наконец, предположим, что шлюз возвращает ссылки на сервер FTP, например, с таким адресом: ftp://ftp.cso.uiuc.edu. Вывод шлюза будет таков. вывода конец вывода Программы, реализующие эти возможности, достаточно прозрачны - они просто помещают в поток вывода соответствующие директивы, если обработка входных данных покажет, что в этом имеется необходимость. не Допустим теперь, что у нас имеется шлюз, который общается с клиентом непо- средственным образом. Как уже отмечалось, его имя должно начинаться с пре- фикса и он должен возвращать клиентскому браузеру корректный заго- ловок HTTP. В этом случае, если сервер при запуске программы шлюза устано- вил для переменной окружения значение его вывод должен удовлетворять протоколу HTTP вывода Server: text/plain вывода П Р И Л О Ж Е Н И Е С HTTP Все информационные ресурсы Интернета организованы в виде гипертекстовой информационной системы, более известной как сеть Web, хранящей документы HTML, связанные между собой гиперссылками. Для взаимодействия клиентских компьютеров с серверами Web используется протокол HTTP (Hypertext Transfer Protocol - Протокол передачи гипертекстовых файлов). Протокол HTTP обеспечивает загрузку на клиентский компьютер документа по указанному адресу и переходы на другие документы по гиперссылкам. В настоящее время применяется версия HTTP этого протокола (определенная стандартом RFC 2616, который можно найти в Интернете по адресу и подготавливается новая версия HTTP 1.2. Обсудим основные принципы сетевого взаимодействия, определяемые протоколом HTTP cmpykmypa HTTP Взаимодействие клиентского компьютера с сервером Web протекает следующим образом. Пользователь указывает браузеру адрес нужного ему документа Web, браузер посылает серверу запрос, на который он через какое-то время получает ответ и отображает его пользователю. Протокол HTTP определяет структуру данных, передаваемых серверу (запрос) и получаемых с сервера (ответ, или ответное сообщение). Эти сообщения представляют собой последовательности байтов двоичного кода, называемых потоками, путешествующими от сервера к клиенту и обратно. И запрос, и ответ имеют одинаковую структуру, или формат этих потоков информации. Формат запроса (ответа) определяется стандартом RFC 822. Сообщения HTTP 1.1 состоят из начальной строки, совокупности полей заголовков, разделенных символами возврата каретки (CR) и перевода строки (LF) - и необязательного тела сообщения. Начальная CRLF [Тело Начальные строки в запросных и ответных сообщениях различаются между собой. запросных сообщениях начальная строка включает в себя метод обработки ресурса, запрашиваемого по указанному далее в строке адресу ресурса, а также номер версии протокола HTTP. В ответных сообщениях начальная строка играет роль строки состояния, содержащей трехзначный числовой код, фиксирующий итог выполнения запроса. Каждая цифра этого кода означает определенное состояние процесса выполнения запроса; например, значение строки состояния 200 означает успешное выполнение запроса, 402 - указывает на необходимость оплаты за загрузку ресурса, и т.д. 332 Быстро и легко. Хакинг и Тело сообщения содержит те сведения, которые, собственно, и передаются в сообщении (например, документ HTML). Заголовки сообщений являются полями данных, также называемых полями заголовков. Они состоят из имени поля (состоящего из набора букв, причем регистр букв не учитывается) и необязательного значения поля, разделенных символом двоеточия (:). Заголовок поля [Значение поля] Назначение полей заголовков в запросных и ответных сообщениях различно, но все они подразделяются на общие заголовки, заголовки ответов, заголовки запросов и информационные заголовки. • Общие заголовки содержат информацию, одинаково применимую как в запросах, так и ответах, например, дату запроса или параметры соединения. • Заголовки запросов передают серверу дополнительную информацию о клиенте, например, его идентификационные данные, требуемые для доступа к запрашиваемому ресурсу. • Заголовки ответов, наоборот, передают клиенту информацию о сервере, например, информацию о программе (включая ее название и краткое описание), используемой для обработки запроса. • Информационные заголовки включают сведения о самой информации, пере- даваемой в запросе или ответе. Заголовки первых трех типов рассмотрены в разделе «Запросное сообщение HTTP», где будет обсуждаться работа с формами, а сейчас обратим внимание на информационные заголовки, которые непосредственным образом определяют характер содержимого документа HTML, т.е. содержат метаданные о документе. Вот список этих заголовков (табл. HTTP 1.1 Имя Назначение Содержит перечень методов, допустимых в запросах данного ресурса, например: Allow: GET, HEAD, PUT Content- Encoding Указывает способ кодирования тела запроса и используется для указания метода сжатия, примененного к телу сообще- ния. Дополняет указание типа содержимого в теле сообще- ния, содержащееся в заголовке Content-Type, например: Content-Encoding: gzip (указывает на сжатие gzip) Приложение С Имя Content- Language Content- Length Content- Location Content- Range Content-Type Expires Last-Modified Назначение Указывает на исходный язык документа, например: Content-Language: da (здесь определен датский язык) Указывает размер документа в байтах, например: Content-Length: 35645 Содержит перечень относительных и/или абсолютных адре- сов URL других ресурсов, требуемых телу сообщения, и хра- нящихся в других местах Web. При разрешении указанных здесь относительных адресов URL базовым адресом считает- ся адрес запроса. Содержит дайджест (т.е. краткий цифровой код документа, используемый для его цифровой подписи) тела сообщения, определенный стандартом RFC Если тело сообщения передается частями, этот заголовок ука- зывает позицию фрагмента сообщения во всем сообщении. Перечисляет все типы содержимого для данных, хранимых в теле сообщения. Значения этого заголовка имеют такой формат: Здесь Туре - это тип, a Subtype - подтип содержимого; после этой пары могут быть перечислены соответствующие ей па- раметры и их значения, разделенные точкой с запятой. На- пример, заголовок: Content-Type: charset=ISO-8859-4 указывает, что тело сообщения является текстовым докумен- том HTML, подготовленным в кодировке ISO-8859-4. Исполь- зуемые типы содержимого должны регистрироваться в спе- циальной организации (Internet Assigned Numbers Authority - Агентство по выделению имен и уникальных пара- метров протоколов Интернет). Указывает дату и время, по истечении которого информация в теле сообщения считается устаревшей, например: Expires: Sat, 04 Dec GMT Указывает дату и время последнего обновления ресурса, на- пример: Last-Modified: Tue, 17 Dec 2001 11:40:26 GMT 334 Быстро и легко. Хакинг и Антихакинг В дополнение к заголовкам в табл. информационные заголовки могут быть пополнены другими заголовками, что не требует внесения изменений в протокол (хотя дополнительные заголовки не обязаны распознаваться всеми программами обработки документов HTML). Чтобы включить в ответное сообщение, посы- лаемое на запрос документа HTML, информационный заголовок HTTP, авторы могут воспользоваться элементом МЕТА языка HTML. Запросное HTTP Запросное сообщение HTTP имеет ту же самую структуру, что и ответное (см. выше), за исключением начальной строки. Эта строка в случае запросных сообщений называется строкой запроса, и она имеет такой вид. Строка SP SP Здесь SP - это символ пробела ASCII (код 32), Метод - это название метода HTTP, который должен быть применен к ресурсу, указанному запрашиваемым адресом URL, a - это код возврата каретки (CR) и перевода строки Набор методов запроса HTTP указан в табл. Таблица 2. Методы запроса HTTP Метод Назначение Этот метод представляет собой запрос информации о сред- ствах, обеспечиваемых подключением к запрашиваемому ресурсу. OPTIONS GET Этот метод предназначен для запроса информации, пре- доставляемой ресурсом, указанным адресом URL запроса. Эта информация должна предоставляться в теле ответного сообщения. HEAD Этот метод подобен методу GET за исключением того, что теперь сервер не должен предоставлять информацию в те- ле ответного сообщения; от него требуется только с помо- щью заголовков HTTP переслать метаинформацию о ре- сурсе. POST Этот метод применяется для запроса, который указывает серверу, что пересылаемое в запросе тело сообщения должно быть передано ресурсу, указанному адресом в строке запроса. PUT Этот метод указывает, что содержащаяся в теле запроса информация должна быть помещена на сервер по указан- ному адресу |