Страница 94 из 133
· «/H1»
· «I»«B»И«/B»дея "единого ножа для швейцарской армии" имеет свои достоинства,
· но когда ее доводят до абсурда, этот нож становится камнем на шее.«/I»
· «BR»
· «DIV align=right»
· Никлаус Вирт
· «BR»
· "От разработки языков программирования к констуироваию компьютеров"
· «HR»
· «/BODY»
Указание спецификации HTTP 1.0 приводит к тому, что ответ сервера немного отличается от предыдущего. В нем появляется заголовок с множеством любопытных полей, несущих в себе информацию о сервере, дате последней модификации документа и других, не менее полезных сведений.
Выделенная жирным шрифтом строка «Co
Чтобы изменить значение поля “Co
· GET /~kpnc/ HTTP/1.0
· Co
·
· HTTP/1.1 200 OK
· Date: Sat, 15 Apr 2000 06:10:37 GMT
· Server: Apache/1.3.6 (Unix)
· Last-Modified: Thu, 13 Apr 2000 11:30:04 GMT
· ETag: "b139bf-83-38f5afbc"
· Accept-Ranges: bytes
· Content-Length: 131
· Keep-Alive: timeout=15 , max=100
· Co
· Content-Type: text/html
·
· «BODY»
· «BR»
· «BR»
· «HR»
· «H1»
· «CENTER»
· Helo, Sailor!
· «/H1»
· «BR»
· «H2»
· Click «A HREF="next.htm"»here«/A»
· «/h2»
· «HR»
· «/BODY»
Выделенная жирным шрифтом строка говорит о том, что соединение будет удерживаться в течение пятнадцати секунд и, если в течение этого времени клиент не проявит никакой активности, - будет разорвано сервером.
Манипулируя значением “timeout” можно увеличить этот промежуток до 100 секунд (вполне достаточно для комфортной работы в telnet-клиенте), но это предел, превысить который не позволят настойки сервера. (Максимальное ограничение во времени на удержание соединения варьируется от сервера к серверу).
Остальные поля заголовка исчерпывающе описаны в RFC-1945 и RFC-2068, и здесь не рассматриваются.
Для удаленного выполнения программ может использоваться все тот же метод “GET”, вызываемый точно так, как для запроса содержимого обычного HTML-документа. Единственное различие заключается в том, что клиенту возвращается не исходный текст программы, а результат ее работы. Получить в свое распоряжение содержимое исполняемого файла невозможно (точнее не должно быть возможно), даже если имеются права на его чтение.
Врезка «информация»
Вспоминается громкий скандал, развернувшийся вокруг обнаруженной ошибки в Internet Information Server 3.0 (IIS 3.0), позволяющий получить доступ к содержимому asp (Active Server Pages) скриптов добавлением в конце имени знака точки. То есть, если к default.asp [255], расположенному на сайте www.microsoft.com [256], обратиться так - “GET /default.asp . [257]”, то сервер вернет сам файл, а не результат его работы.
Например:
GET /Default.asp.
«% emailx=request.form("email")
remarkx=request.form("remark")
Set Co
Co
Set RS = Co
Your information has been added to our database.
Разработчики впопыхах дописали несколько наивных строк тривиально фильтра и поплатились за это. В суматохе никому и в голову не пришло, что тот же самый вызов можно записать и как - “GET /default.asp%20/”, то есть заменить символ точки ее шестнадцатеричным значением. И только что выпущенная заплатка оказалась бесполезной.
Отсюда мораль - не каждая попытка заткнуть дыру заканчивается успешно. Забудьте свою психологическую инерцию и тестируйте все возможные значения -от осмысленных до явно бредовых.
Врезка «замечание»
При правильной политике администрирования, ошибка в IIS никак не влияла на его работу. Достаточно было убрать права на чтение файла. К сожалению, в большинстве случаев такие права установлены, в надежде на грамотную защиту сервера, теоретически никогда не путающего содержимое скрипта с результатами его работы.
В качестве небольшого упражнения, можно запустить демонстрационный пример, расположенный по адресу http://lighning.prohosting.com/~/kpnc/cgi-bin/helo.pl Результат его работы показан на рисунке, приведенном ниже:
Рисунок 20 Демонстрация удаленного выполнения программы
Если заглянуть в исходный файл, прилагаемый к книге (“/SRC/Hello.pl”), бросается в глаза одна странность:
· #!/usr/local/bin/perl -w
· print "Content-type: text/html
· print "Hello,Sailor!n";
Сервер «съел» одну строку (в листинге она выделена жирным шрифтом). Если же ее попытаться убрать, то выполнение скрипта прервется с сообщением об ошибке. Причины такого поведения подробно рассмотрены в дополнении «Протокол CGI».
В главе «Что можно сделать с помощью Perl» замечалось, что многие сервера неявно предоставляют возможность выполнения скриптов. Для этого достаточно поместить свой файл в директорию, с атрибутами “r w x - - x - - -x”, которая, как правило, называется «/BIN» или «/CGI-BIN». Иногда это можно сделать с помощью FTP (File Transfer Protocol, смотри главу «Протокол FTP» [258]), но в подавляющем большинстве случаев ftp-доступ закрыт (точнее, правильнее было бы сказать, не открыт).
Напротив же, метод PUT может быть не закрыт, что позволит с успехом им воспользоваться (в Internet все, что явно не запрещено - разрешено). Использование метода PUT требует явного заполнения некоторых полей, которые будет рассмотрены ниже.