Дешевый Заменитель Clarinex Силденафил Bbs Cgi Mode. Технологии Интернет. Лабораторный практикум: CGI Быстрая обучающая программа по формам HTML

Дешевый Заменитель Clarinex Силденафил Aska Cgi Дешевый заменитель clarinex ... Дешевый заменитель clarinex силденафил add cgi . 2552 голосов. Дешевые Pfizer Виагры Bbs Cgi Mode - remgruzshina.ru ... силденафил bbs cgi mode что было... Дешевый Заменитель Clarinex Силденафил Aska Cgi Дешевый ... Независимая экспертиза - Дешевый Сиалис Cbbs Cgi Mode ... cbbs cgi mode дешевый заменитель clarinex силденафил bbs cgi mode ... аптека дешевый сиалис bbs cgi ... Дешевый Заменитель Clarinex Силденафил Inurl Joyful Cgi Дешевый заменитель clarinex ... Силденафил Inurl Joyful Cgi Дешевый заменитель clarinex силденафил bbs cgi mode . ... Дешевый Заменитель Clarinex Силденафил Add Cgi Дешевый заменитель clarinex силденафил aska cgi Дешевый ... и акции.Дешевый сиалис cbbs cgi mode ... Дешевый Заменитель Clarinex Силденафил Inurl Guest Cgi Pageid Дешевый заменитель clarinex ... clarinex силденафил inurl guest cgi pageid ... clarinex силденафил bbs cgi mode ... Дешевый Заменитель Clarinex Силденафил Inurl C Board Cgi Cmd ... Стерлитамак - Страна Красоты, салоны красоты... Отзывы о компаниях. Нурия - салон... Дешевый Заменитель Clarinex Силденафил Bbs Кирпич и бетон; Лесоматериалы; Прочие строительные товары и услуги; Товары для организации... Дешевый Заменитель Clarinex Силденафил Vbulletin Дешевый Заменитель Clarinex ... заменитель clarinex силденафил bbs cgi mode что было... Камагра Жидких Bbs Cgi Mode - russiancontour.com На самом деле Герасим не утопил Муму. Ибо кто рассказал эту историю Тургеневу, если Герасим...

КотокафеМира - Дешевые Pfizer Виагры Bbs Inaka Jsp

Дешевый заменитель clarinex ... Дешевый заменитель clarinex силденафил bbs inaka jsp. дешевый ... Дешевый Заменитель Clarinex Силденафил Inurl Addguest Html ... Минеральная вода в косметологии. Минеральная вода - прекрасное натуральное средство для... Дешевый Заменитель Clarinex Силденафил Inurl Apeboard Plus Cgi Обучение английскому языку, обучение за границей... Для самых маленьких; Индивидуальные... Дешевый Заменитель Clarinex Силденафил Inurl Gbook Php A Дешевый заменитель clarinex ... Clarinex Силденафил Inurl Guest Cgi Pageid Дешевый сиалис cbbs cgi mode Дешевый ... Купить Виагру 100 Мг Бирмингеме Inurl Bbs Cgi Купить виагру 100 мг бирмингеме bbs cgi : Одна из самых новых... Войти на форум. Главная форума. Индия Дешевый Сиалис Inurl Sign Php Дешевый Заменитель Clarinex ... Inurl Bbs Cgi Купить... Силденафил Aska Cgi Дешевый ... Дешевый Заменитель Clarinex Силденафил Inurl Fsguest Html Дешевый заменитель clarinex ... Дешевый заменитель clarinex силденафил inurl joyful cgi » Принцип действия... Дешевый Заменитель Clarinex Силденафил Addurl Aspx дешевый заменитель clarinex силденафил ... cgi Дешевый заменитель ... дешевый заменитель clarinex ... Дешевые Pfizer Виагры C Board Cgi Cmd Дешевый заменитель clarinex силденафил inurl guestbook php Дешевый заменитель clarinex ... C Board Cgi Cmd ... Дешевые Pfizer Виагры Inurl Guestbook Html ... Заменитель Clarinex Силденафил Inurl Addguest Html Дешевый Заменитель Clarinex Силденафил Inurl C Board Cgi Cmd ...

Cgi

Дешевые Pfizer Виагры Inurl Yybbs Cgi . ... Cialis Сиалис купить левитру в городе тула Дешевый сиалис bbs CGI ... Тадалафил В Хмельницком Тадалафил в Хмельницком. Сравнить цены, купить... Тадалафил в Хмельницком. Вы хотите купить... Дешевый Заменитель Clarinex Силденафил Aska Cgi Дешевый заменитель clarinex силденафил aska cgi « Дешевый... Дешевый заменитель clarinex силденафил add ... Дешевые Pfizer Виагры Add Cgi - rsk-legion.ru Дешевые pfizer виагры inurl guestbook html Где Я Могу Заказать Виагру Inurl Add Cgi ... силденафил, ... bbs cgi ... Купить Камагра Без Prescripton Великобритании Inurl Light Cgi Камагра Жидких Bbs Cgi Mode ... Дешевый Заменитель Clarinex Силденафил Add Cgi Дешевый заменитель clarinex ... Купить Виагру 100 Мг Бирмингеме Add Html ... addurl aspx Дешевый заменитель clarinex силденафил ... Камагра Жидких Bbs Cgi Mode ... Пан силденафил ... Дешевый Сиалис Board Cgi Id - style-ultramarine.ru Салон красоты "Стайл Ультрамарин" ... Дешевый сиалис addguest cgi : Форум! | Импотенция лечить дома... Где Я Могу Заказать Виагру Inurl Sign Asp | Москва - Страна... inurl joyful cgi ... Дешевый заменитель clarinex силденафил inurl addentry php ... Камагра Жидких Bbs Cgi Mode ... "Автопартнер" - Работает Ли Сиалис Если Эрекция Отсутствует... Все для автомоек Аппараты для химчистки Полировальные машинки Пылеводососы Пылеводососы Inurl Showthread Купить Виагру - vgazele.ru Левитра в аптеках беларуси Inurl showthread купить виагру: Купить сиалис, виагру, левитра.

Взлом при помощи Google

Alexander Antipov

Поисковая система Google (www.google.com) предоставляет множество возможностей для поиска. Все эти возможности – неоценимый инструмент поиска для пользователя впервые попавшего в Интернет и в то же время еще более мощное оружие вторжения и разрушения в руках людей с злыми намерениями, включая не только хакеров, но и некомпьютерных преступников и даже террористов.
(9475 просмотров за 1 неделю)


Денис Батранков
denisNOSPAMixi.ru

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

Введение

Я, например, за 0.14 секунд нашел 1670 страниц!

2. Введем другую строку, например:

inurl:"auth_user_file.txt"

немного меньше, но этого уже достаточно для свободного скачивания и для подбора паролей (при помощи того же John The Ripper). Ниже я приведу еще ряд примеров.

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

Впервые информация о Google Hacking появилась на рассылке Bugtruck еще 3 года назад. В 2001 году эта тема была поднята одним французским студентом. Вот ссылка на это письмо http://www.cotse.com/mailing-lists/bugtraq/2001/Nov/0129.html . В нем приведены первые примеры таких запросов:

1) Index of /admin
2) Index of /password
3) Index of /mail
4) Index of / +banques +filetype:xls (for france...)
5) Index of / +passwd
6) Index of / password.txt

Нашумела эта тема в англо-читающей части Интернета совершенно недавно: после статьи Johnny Long вышедшей 7 мая 2004 года. Для более полного изучения Google Hacking советую зайти на сайт этого автора http://johnny.ihackstuff.com . В этой статье я лишь хочу ввести вас в курс дела.

Кем это может быть использовано:
- Журналисты, шпионы и все те люди, кто любит совать нос не в свои дела, могут использовать это для поиска компромата.
- Хакеры, разыскивающие подходящие цели для взлома.

Как работает Google.

Для продолжения разговора напомню некоторые из ключевых слов, используемых в запросах Google.

Поиск при помощи знака +

Google исключает из поиска неважные, по его мнению, слова. Например вопросительные слова, предлоги и артикли в английском языке: например are, of, where. В русском языке Google, похоже, все слова считает важными. Если слово исключается из поиска, то Google пишет об этом. Чтобы Google начал искать страницы с этими словами перед ними нужно добавить знак + без пробела перед словом. Например:

ace +of base

Поиск при помощи знака –

Если Google находит большое количество станиц, из которых необходимо исключить страницы с определенной тематикой, то можно заставить Google искать только страницы, на которых нет определенных слов. Для этого надо указать эти слова, поставив перед каждым знак – без пробела перед словом. Например:

рыбалка -водка

Поиск при помощи знака ~

Возможно, что вы захотите найти не только указанное слово, но также и его синонимы. Для этого перед словом укажите символ ~.

Поиск точной фразы при помощи двойных кавычек

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

"подставка для книг"

Чтобы было хоть одно из указанных слов нужно указать логическую операцию явно: OR. Например:

книга безопасность OR защита

Кроме того в строке поиска можно использовать знак * для обозначения любого слова и. для обозначения любого символа.

Поиск слов при помощи дополнительных операторов

Существуют поисковые операторы, которые указываются в строке поиска в формате:

operator:search_term

Пробелы рядом с двоеточием не нужны. Если вы вставите пробел после двоеточия, то увидите сообщение об ошибке, а перед ним, то Google будет использовать их как обычную строку для поиска.
Существуют группы дополнительных операторов поиска: языки - указывают на каком языке вы хотите увидеть результат, дата - ограничивают результаты за прошедшие три, шесть или 12 месяцев, вхождения - указывают в каком месте документа нужно искать строку: везде, в заголовке, в URL, домены - производить поиск по указанному сайту или наоборот исключить его из поиска, безопасный поиск - блокируют сайты содержащие указанный тип информации и удаляют их со страниц результатов поиска.
При этом некоторые операторы не нуждаются в дополнительном параметре, например запрос "cache:www.google.com " может быть вызван, как полноценная строка для поиска, а некоторые ключевые слова, наоборот, требуют наличия слова для поиска, например " site:www.google.com help ". В свете нашей тематики посмотрим на следующие операторы:

Оператор

Описание

Требует дополнительного параметра?

поиск только по указанному в search_term сайту

поиск только в документах с типом search_term

найти страницы, содержащие search_term в заголовке

найти страницы, содержащие все слова search_term в заголовке

найти страницы, содержащие слово search_term в своем адресе

найти страницы, содержащие все слова search_term в своем адресе

Оператор site: ограничивает поиск только по указанному сайту, причем можно указать не только доменное имя, но и IP адрес. Например, введите:

Оператор filetype: ограничивает поиск в файлах определенного типа. Например:

На дату выхода статьи Googlе может искать внутри 13 различных форматов файлов:

  • Adobe Portable Document Format (pdf)
  • Adobe PostScript (ps)
  • Lotus 1-2-3 (wk1, wk2, wk3, wk4, wk5, wki, wks, wku)
  • Lotus WordPro (lwp)
  • MacWrite (mw)
  • Microsoft Excel (xls)
  • Microsoft PowerPoint (ppt)
  • Microsoft Word (doc)
  • Microsoft Works (wks, wps, wdb)
  • Microsoft Write (wri)
  • Rich Text Format (rtf)
  • Shockwave Flash (swf)
  • Text (ans, txt)

Оператор link: показывает все страницы, которые указывают на указанную страницу.
Наверно всегда интересно посмотреть, как много мест в Интернете знают о тебе. Пробуем:

Оператор cache: показывает версию сайта в кеше Google, как она выглядела, когда Google последний раз посещал эту страницу. Берем любой, часто меняющийся сайт и смотрим:

Оператор intitle: ищет указанное слово в заголовке страницы. Оператор allintitle: является расширением – он ищет все указанные несколько слов в заголовке страницы. Сравните:

intitle:полет на марс
intitle:полет intitle:на intitle:марс
allintitle:полет на марс

Оператор inurl: заставляет Google показать все страницы содержащие в URL указанную строку. Оператор allinurl: ищет все слова в URL. Например:

allinurl:acid acid_stat_alerts.php

Эта команда особенно полезна для тех, у кого нет SNORT – хоть смогут посмотреть, как он работает на реальной системе.

Методы взлома при помощи Google

Итак, мы выяснили что, используя комбинацию вышеперечисленных операторов и ключевых слов, любой человек может заняться сбором нужной информации и поиском уязвимостей. Эти технические приемы часто называют Google Hacking.

Карта сайта

Можно использовать оператор site: для просмотра всех ссылок, которые Google нашел на сайте. Обычно страницы, которые динамически создаются скриптами, при помощи параметров не индексируются, поэтому некоторые сайты используют ISAPI фильтры, чтобы ссылки были не в виде /article.asp?num=10&dst=5 , а со слешами /article/abc/num/10/dst/5 . Это сделано для того, чтобы сайт вообще индексировался поисковиками.

Попробуем:

site:www.whitehouse.gov whitehouse

Google думает, что каждая страница сайта содержит слово whitehouse. Этим мы и пользуемся, чтобы получить все страницы.
Есть и упрощенный вариант:

site:whitehouse.gov

И что самое приятное - товарищи с whitehouse.gov даже не узнали, что мы посмотрели на структуру их сайта и даже заглянули в кэшированные странички, которые скачал себе Google. Это может быть использовано для изучения структуры сайтов и просмотра содержимого, оставаясь незамеченным до поры до времени.

Просмотр списка файлов в директориях

WEB серверы могут показывать списки директорий сервера вместо обычных HTML страниц. Обычно это делается для того, чтобы пользователи выбирали и скачивали определенные файлы. Однако во многих случаях у администраторов нет цели показать содержимое директории. Это возникает вследствие неправильной конфигурации сервера или отсутствия главной страницы в директории. В результате у хакера появляется шанс найти что-нибудь интересное в директории и воспользоваться этим для своих целей. Чтобы найти все такие страницы, достаточно заметить, что все они содержат в своем заголовке слова: index of. Но поскольку слова index of содержат не только такие страницы, то нужно уточнить запрос и учесть ключевые слова на самой странице, поэтому нам подойдут запросы вида:

intitle:index.of parent directory
intitle:index.of name size

Поскольку в основном листинги директорий сделаны намеренно, то вам, возможно, трудно будет найти ошибочно выведенные листинги с первого раза. Но, по крайней мере, вы уже сможете использовать листинги для определения версии WEB сервера, как описано ниже.

Получение версии WEB сервера.

Знание версии WEB сервера всегда полезно перед началом любой атака хакера. Опять же благодаря Google можно получить эту информацию без подключения к серверу. Если внимательно посмотреть на листинг директории, то можно увидеть, что там выводится имя WEB сервера и его версия.

Apache1.3.29 - ProXad Server at trf296.free.fr Port 80

Опытный администратор может подменить эту информацию, но, как правило, она соответствует истине. Таким образом, чтобы получить эту информацию достаточно послать запрос:

intitle:index.of server.at

Чтобы получить информацию для конкретного сервера уточняем запрос:

intitle:index.of server.at site:ibm.com

Или наоборот ищем сервера работающие на определенной версии сервера:

intitle:index.of Apache/2.0.40 Server at

Эта техника может быть использована хакером для поиска жертвы. Если у него, к примеру, есть эксплойт для определенной версии WEB сервера, то он может найти его и попробовать имеющийся эксплойт.

Также можно получить версию сервера, просматривая страницы, которые по умолчанию устанавливаются при установке свежей версии WEB сервера. Например, чтобы увидеть тестовую страницу Apache 1.2.6 достаточно набрать

intitle:Test.Page.for.Apache it.worked!

Мало того, некоторые операционные системы при установке сразу ставят и запускают WEB сервер. При этом некоторые пользователи даже об этом не подозревают. Естественно если вы увидите, что кто-то не удалил страницу по умолчанию, то логично предположить, что компьютер вообще не подвергался какой-либо настройке и, вероятно, уязвим для атак.

Попробуйте найти страницы IIS 5.0

allintitle:Welcome to Windows 2000 Internet Services

В случае с IIS можно определить не только версию сервера, но и версию Windows и Service Pack.

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

inurl:manual apache directives modules

Использование Google как CGI сканера.

CGI сканер или WEB сканер – утилита для поиска уязвимых скриптов и программ на сервере жертвы. Эти утилиты должны знать что искать, для этого у них есть целый список уязвимых файлов, например:

/cgi-bin/cgiemail/uargg.txt
/random_banner/index.cgi
/random_banner/index.cgi
/cgi-bin/mailview.cgi
/cgi-bin/maillist.cgi
/cgi-bin/userreg.cgi

/iissamples/ISSamples/SQLQHit.asp
/SiteServer/admin/findvserver.asp
/scripts/cphost.dll
/cgi-bin/finger.cgi

Мы может найти каждый из этих файлов с помощью Google, используя дополнительно с именем файла в строке поиска слова index of или inurl: мы можем найти сайты с уязвимыми скриптами, например:

allinurl:/random_banner/index.cgi

Пользуясь дополнительными знаниями, хакер может использовать уязвимость скрипта и с помощью этой уязвимости заставить скрипт выдать любой файл, хранящийся на сервере. Например файл паролей.

Как защитить себя от взлома через Google.

1. Не выкладывайте важные данные на WEB сервер.

Даже если вы выложили данные временно, то вы можете забыть об этом или кто-то успеет найти и забрать эти данные пока вы их не стерли. Не делайте так. Есть много других способов передачи данных, защищающих их от кражи.

2. Проверьте свой сайт.

Используйте описанные методы, для исследования своего сайта. Проверяйте периодически свой сайт новыми методами, которые появляются на сайте http://johnny.ihackstuff.com . Помните, что если вы хотите автоматизировать свои действия, то нужно получить специальное разрешение от Google. Если внимательно прочитать http://www.google.com/terms_of_service.html , то вы увидите фразу: You may not send automated queries of any sort to Google"s system without express permission in advance from Google.

3. Возможно, вам не нужно чтобы Google индексировал ваш сайт или его часть.

Google позволяет удалить ссылку на свой сайт или его часть из своей базы, а также удалить страницы из кэша. Кроме того вы можете запретить поиск изображений на вашем сайте, запретить показывать короткие фрагменты страниц в результатах поиска Все возможности по удалению сайта описаны на сранице http://www.google.com/remove.html . Для этого вы должны подтвердить, что вы действительно владелец этого сайта или вставить на страницу теги или

4. Используйте robots.txt

Известно, что поисковые машины заглядывают в файл robots.txt лежащий в корне сайта и не индексируют те части, которые помечены словом Disallow . Вы можете воспользоваться этим, для того чтобы часть сайта не индексировалась. Например, чтобы не индексировался весь сайт, создайте файл robots.txt содержащий две строчки:

User-agent: *
Disallow: /

Что еще бывает

Чтобы жизнь вам медом не казалась, скажу напоследок, что существуют сайты, которые следят за теми людьми, которые, используя вышеизложенные выше методы, разыскивают дыры в скриптах и WEB серверах. Примером такой страницы является

Приложение.

Немного сладкого. Попробуйте сами что-нибудь из следующего списка:

1. #mysql dump filetype:sql - поиск дампов баз данных mySQL
2. Host Vulnerability Summary Report - покажет вам какие уязвимости нашли другие люди
3. phpMyAdmin running on inurl:main.php - это заставит закрыть управление через панель phpmyadmin
4. not for distribution confidential
5. Request Details Control Tree Server Variables
6. Running in Child mode
7. This report was generated by WebLog
8. intitle:index.of cgiirc.config
9. filetype:conf inurl:firewall -intitle:cvs – может кому нужны кофигурационные файлы файрволов? :)
10. intitle:index.of finances.xls – мда....
11. intitle:Index of dbconvert.exe chats – логи icq чата
12. intext:Tobias Oetiker traffic analysis
13. intitle:Usage Statistics for Generated by Webalizer
14. intitle:statistics of advanced web statistics
15. intitle:index.of ws_ftp.ini – конфиг ws ftp
16. inurl:ipsec.secrets holds shared secrets – секретный ключ – хорошая находка
17. inurl:main.php Welcome to phpMyAdmin
18. inurl:server-info Apache Server Information
19. site:edu admin grades
20. ORA-00921: unexpected end of SQL command – получаем пути
21. intitle:index.of trillian.ini
22. intitle:Index of pwd.db
23. intitle:index.of people.lst
24. intitle:index.of master.passwd
25. inurl:passlist.txt
26. intitle:Index of .mysql_history
27. intitle:index of intext:globals.inc
28. intitle:index.of administrators.pwd
29. intitle:Index.of etc shadow
30. intitle:index.of secring.pgp
31. inurl:config.php dbuname dbpass
32. inurl:perform filetype:ini

  • "Hacking mit Google"
  • Учебный центр "Информзащита" http://www.itsecurity.ru - ведущий специализированный центр в области обучения информационной безопасности (Лицензия Московского Комитета образования № 015470, Государственная аккредитация № 004251). Единственный авторизованный учебный центр компаний Internet Security Systems и Clearswift на территории России и стран СНГ. Авторизованный учебный центр компании Microsoft (специализация Security). Программы обучения согласованы с Гостехкомиссией России, ФСБ (ФАПСИ). Свидетельства об обучении и государственные документы о повышении квалификации.

    Компания SoftKey – это уникальный сервис для покупателей, разработчиков, дилеров и аффилиат–партнеров. Кроме того, это один из лучших Интернет-магазинов ПО в России, Украине, Казахстане, который предлагает покупателям широкий ассортимент, множество способов оплаты, оперативную (часто мгновенную) обработку заказа, отслеживание процесса выполнения заказа в персональном разделе, различные скидки от магазина и производителей ПО.

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

    CGI определяет каким образом данные, предоставленные клиентом в запросе, передаются программе, как программа возвращает сгенерированный HTML-контент серверу, и какие переменные окружения устанавливаются сервером при запуске программы. Переменные окружения несут дополнительную информацию о сервере и запросе (например, тип сервера, IP-адрес клиента и др.).

    Данные из заполненной клиентом HTML-формы могут передаваться на сервер двумя методами: GET и POST, это определяется параметром method соответствующего тэга <form method=... action=... >. В первом случае (GET) данные присоединяются после вопросительного знака в конец URL, указанной в параметре action , во втором случае - передаются в теле запроса - в секции, предназначенной для данных (следует после всех заголовокв и пустой строки). В обоих случаях данные кодируются одинаково - см. след. пункт.

    При вызове CGI-программы все, что поступило в теле запроса, подается программе на стандартный ввод, а все, что находится в URL после вопросительного знака, помещается в переменную окружения QUERY_STRING. Веб-сервером данные запроса никак не интерпретируются и не преобразуются, эти задачи возложены на CGI-программу.

    CGI-программа выдает содержимое ответа (как правило, HTML-контент) на свой стандартный вывод, который перехватывается веб-сервером с тем, чтобы отослать эти данные клиенту. Предварительно CGI-программа должна напечатать заголовок "Content-Type" и отделить его от данных пустой строкой. Например, вывод CGI-программы, генерирующей HTML, может выглядеть следующим образом:

    Content-Type: text/html

    Hello, world

    Конфигурирование сервера Apache для исполнения CGI-скриптов

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

    ScriptAlias /виртуальный/путь / /путь/к/каталогу / ScriptAlias /cgi-bin/ /usr/local/www/cgi-bin/ Это означает, что для обработки запроса URL вида http://your.server.com/cgi-bin/dir/script будет взят не файл script из каталога DocumentRoot /cgi-bin/dir/, а запущена программа /usr/local/www/cgi-bin/dir/script.

    Для смешанного хранения файлов, подлежащих просмотру, и CGI-скриптов в одном каталоге внутри дерева DocumentRoot следует присвоить CGI-скриптам одинаковые расширения (например, ".cgi") и указать серверу, что интерпретировать такие файлы следует как CGI-скрипты:

    AddHandler cgi-script .cgi Директива AddHandler может быть использована в любом контексте конфигурации Apache.

    Структура URL и кодирование данных запроса

    Для работы CGI-программ важное значение имеют части URL, называемые PATH_INFO и QUERY_STRING. Рассмотрим запрос с URL вида

    Http://my.server.com/cgi-bin/dir/prog/a/b?A=1&B=qwerty

    Используя директиву ScriptAlias , приведенную в предыдущем пункте, сервер определяет что произошло обращение к CGI-программе и для поиска этой программы заменяет начальное /cgi-bin/ на /usr/local/www/cgi-bin/ . Следуя запрошенному URL, сервер обнаруживает в этом каталоге подкаталог dir , однако подкаталога prog в каталоге /usr/local/www/cgi-bin/dir не обнаружено. В таком случае сервер предполагает, что prog - имя CGI-программы, подлежащей выполнению. Если программа /usr/local/www/cgi-bin/dir/prog не найдена или не может быть исполнена, сервер возвращает клиенту ошибку 403, 404 или 500. В противном случае программа prog запускается, а оставшаяся часть пути из URL - /a/b - передается программе prog в переменной окружения PATH_INFO. Таким способом можно передать в CGI-программу дополнительные параметры.

    Все, что находится после вопросительного знака - A=1&B=qwerty - передается программе prog в переменной окружения QUERY_STRING. Это могут быть данные из заполненной пользователем формы, отправленные на сервер методом GET, либо какая-то другая информация (сервер не делает никаких предположений об интерпретации данных в QUERY_STRING, это задача вызываемой программы).

    Данные из полей формы, заполненной пользователем - независимо от метода (POST или GET), которым они пересылаются на сервер - кодируются следующим образом:

    имя_поля =значение_поля &имя_поля =значение_поля...

    Пары имя-значение разделяются амперсандом. Алфавитно-цифровые символы и некоторые знаки препинания, не имеющие специального значения (тире, подчеркивание) передаются как есть. Остальные символы кодируются в виде "%NM ", где NM - двузначный шестнадцатеричный код символа. Пробел может передаваться как "%20" или как символ "+". Кириллические символы также должны кодироваться указанным способом. Кодировка производится броузером при отправке полей заполненной формы.

    Например:

    Http://my.server.com/cgi-bin/dir/prog?birthday=11%2F05%2F73&name=John+Smith означает, что в поле birthday пользователь внес "11/05/73", а в поле name - "John Smith".

    Декодирование данных формы является задачей CGI-программы.

    При пересылке данных формы, закодированных вышеописанным способом, методом POST клиент должен установить заголовок запроса Content-Type следующим образом:

    Content-Type: application/x-www-form-urlencoded

    Переменные окружения CGI

    При запуске CGI-скрипта веб-сервер устанавливает дополнительные переменные окружения:

    Переменная Значение
    AUTH_TYPE

    Метод аутентифицирования, использованный для опознания пользователя. См. также REMOTE_USER и REMOTE_IDENT.

    CONTENT_LENGTH

    Длина данных запроса в байтах, переданных CGI-скрипту через стандартный ввод.

    CONTENT_TYPE

    MIME-тип данных запроса.

    DOCUMENT_ROOT

    Корневой каталог дерева документов веб-сервера (определяется директивой DocumentRoot ).

    GATEWAY_INTERFACE

    Используемая версия CGI.

    HTTP_ACCEPT

    Список MIME-типов данных, которые клиент может принять.

    HTTP_FROM

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

    HTTP_REFERER
    HTTP_USER_AGENT

    Броузер клиента.

    PATH_INFO PATH_INFO (если есть) - см. выше " "
    PATH_TRANSLATED

    PATH_INFO, преобразованное в полный путь в файловой системе сервера (PATH_INFO, добавленное к DOCUMENT_ROOT).

    QUERY_STRING

    Данные запроса, переданные в составе URL вслед за вопросительным знаком - см. выше " ".

    REMOTE_ADDR

    IP-адрес клиента.

    REMOTE_HOST Имя DNS клиента.
    REMOTE_USER Аутентифицированное имя пользователя.
    REQUEST_METHOD

    Метод запроса (GET, POST, HEAD и т.д.).

    SCRIPT_NAME Виртуальный путь (например, /cgi-bin/program.pl) к исполняемому CGI-скрипту.
    SERVER_NAME DNS-имя сервера или, при невозможности определить имя, его IP-адрес.
    SERVER_PORT

    Номер порта сервера.

    SERVER_PROTOCOL Имя и версия протокола, через который был сделан запрос (например, HTTP/1.1).
    SERVER_SOFTWARE

    Тип и номер версии ПО веб-сервера.

    С Apache поставляется стандартный тестовый скрипт test-cgi, выводящий занчения переменных окружения CGI.

    Cookies и другие методы сохранения состояния

    Основной проблемой при написании интерактивных CGI-скриптов, т.е. скриптов, чьи последовательные вызовы одним пользователем логически связаны друг с другом, является проблема сохранения состояния. Дело в том, что в протокол HTTP рассматривает все поступающие на сервер запросы как независимые друг от друга. Соответственно, после обработки каждого вновь поступившего запроса CGI-скрипт полностью завершает свою работу, а для обработки следующего запроса, неважно относится ли он к тому же логическому сеансу работы пользователя или нет, скрипт начинает свою работу с нуля без всякой информации о предыстории.

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

    Существует несколько методов сохранения состояния:

    1. cookies - сохранение на компьютере клиента,
    2. скрытые поля - сохранение внутри формы, посылаемой клиенту,
    3. сохранение в файле какого-либо формата на сервере,
    4. сохранение в параллельно работающей базе данных.

    Два последних метода реализуют сохранение состояния на стороне сервера.

    База данных

    В качестве параллельно работающей базы данных может выступать любая из имеющихся СУБД, для обращения к которой язык программирования скрипта имеет интерфейс (в Перле есть библиотеки, обеспечивающие взаимодействие со всеми распространенными СУБД).

    Также существует решение в виде демона, который запускается параллельно с http-сервером, и сохраняет требуемую информацию в своей оперативной памяти в виде переменная =значение . Для записи или извлечения данных скрипт соединяется с демоном по заранее оговоренному порту TCP или UDP, идентифицирует себя и использует набор простых команд типа "save name =value " и "extract name " (возвращается value ).

    Интересно, что несмотря на сложность реализации, такое решение (или использование СУБД с возможностью доступа по сети) позволяет разделять данные между скриптами работающими на различных серверах (если реализуется какая-то сложная распределенная интерактивная веб-система), при этом не вовлекается сохранение данных на стороне пользователя.

    Файл

    Основным недостатком сохранения данных в файле, кроме использования дискового пространства и накладных расходов на файловые операции, является операция записи на диск как таковая. Запись на диск может быть источником серьезных проблем в плане безопасности, так как работа CGI-скрипта фактически управляется воздействием внешних пользователей, которые могут иметь враждебные намерения. Путем посылки каких-либо специальных данных неаккуратно написанному скрипту можно вызвать серьезный сбой в работе сервера. Если же скрипт имеет право записи на диск, то последствия могут быть гораздо серьезнее, поэтому обычно CGI-скрипты, как и сам веб-сервер, работают с минимальными привилегиями от имени пользователя nobody без права записи на диск.

    Сохранение состояния на стороне пользователя

    Сохранение данных состояния на стороне пользователя (cookies и, технически, скрытые поля) существенный недостаток: пользователь имеет полный доступ к сохраняемым данным и может их несанкционированно изменить (например, прочитать правильный ответ теста или изменить идентификатор пользователя). Достоинством является простая реализация.

    Cookies

    Cookies - это данные вида имя =значение , которые, будучи получены от сервера, сохраняются броузером на диске пользователя для их возврата серверу при последующих запросах к этому или другому URL. Поскольку данные сохраняются на диске, они могут быть использованы после перезапуска броузера.

    Сервер передает cookie через специальное поле заголовка HTTP-ответа "Set-Cookie". Броузер возвращает cookie также через специальное поле в загловке HTTP-запроса - "Cookie". На стороне сервера cookie формируется, как правило, скриптом, который просто выводит в STDOUT соответствующий заголовок. Передача данных, полученных через cookie, от броузера в скрипт производится сервером через установку переменной окружения HTTP_COOKIE, которая доступна внутри скрипта и содержит пары имя =значение , которые броузер передал внутри поля "Cookie" в заголовке своего запроса.

    Формат поля Set-Cookie (HTTP-ответ)

    Set-Cookie: имя =значение ; Max-Age=секунды ; Comment=текстовый_комментарий ; Path=URI_или_часть_URI ; Domain=домен_сервера ; Secure ; Version=1

    Все элементы, кроме имя =значение и Version, не являются обязательными. В заголовке одного ответа сервера может содержаться несколько полей Set-Cookie.

    имя =значение информация, предназначенная для сохранения на стороне клиента и последующего возврата серверу; ни в имени , ни в значении не могут содержаться символы пробела, табуляции или точки с запятой; при необходимости такие символы должны быть закодированы в соответствии с общими правилами кодирования URL.

    Max-Age=секунды устанавливает срок годности данных (в секундах с момента получения cookie); по умолчанию - до окончания работы данного проуесса броузера.

    Comment=текстовый_комментарий комментарий сервера по поводу предназначения cookie; предполагается, что пользователь может отказаться работать с этим cookie, если комментарий ему не понравится.

    Domain=домен_сервера домен, для которого действительно данное cookie (броузер должен возвращать cookie при обращении ко всем серверам данного домена, с учетом параметра Path [см. ниже]); домен должен начинаться с точки; данный сервер должен находиться в этом домене. Если параметр Domain не указан - возвращать cookie только данному серверу.

    Path=URI_или_часть_URI путь от корня дерева документов сервера (URI); броузер должен возвращать cookie при обращении к данному URI и ко всем URI, начинающимся с данного; по умолчанию - URI, при запросе которого было сгенерировано cookie, минус имя файла.

    Пример: при обращении на "http://s.vvsu.ru/a/b/c" сервер выдал ответ с установленным полем в заголовке:

    SetCookie: X=5; Version=1 Это значит, что cookie должно возвращаться броузером при обращении на все URL вида "http://s.vvsu.ru/a/b/какое-то_имя_файла ".
    Если же SetCookie в ответе сервера выглядит вот так: SetCookie: X=5; Domain=.vvsu.ru; Path=/a/; Version=1 то броузер должен присоединять это cookie ко всем запросам URL вида: "http://имя_без_точки .vvsu.ru/a/b/некий_путь_или_никакого ".

    Secure если это параметр присутствует, то броузер должен возвращать cookie серверу только через защищенный канал связи; стандарт не специфицирует конкретный механизм защиты данных при передаче, но предполагается, что это SSL.

    Формат поля Cookie (HTTP-запрос)

    Cookie: имя =значение ; Path=URI_или_часть_URI ; Domain=домен_сервера ; Version=1

    Параметры Path и Domain включаются только если они были установлены в заголовке Set-Cookie. Если несколько cookie удовлетворяют параметру Path, то они указываются в одном заголовке Cookie друг за другом (через точку с запятой) в следующем порядке: первыми передаются cookie с более длинным параметром Path. Порядок следования при равенстве параметров Path не определяется.

    Скрытые поля

    Скрытое поле создается внутри формы с помощью тега
    name1 value=value1 >

    Когда броузер получает документ с этой формой, содержимое полей типа "hidden" не отображается и пользователь не знает об их существовании (если только не посмотрит в HTML-текст присланного документа). После того, как пользователь отправляет форму на сервер, пара "name1=value1 " присоединяется к данным формы, которые будут обработаны вновь запущенным скриптом. Таким образом скрипт может получить данные о предыстории своей работы с пользователем. Например, при электронном шоппинге в скрытых полях может сожержаться список товаров, выбранных для покупки в других отделах, которые пользователь уже посетил в данном сеансе работы.

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

    Server Side Includes

    SSI представляет собой механизм разбора HTML-документов на стороне сервера с целью обнаружения в документе и выполнения директив, добавляющих в документ дополнительную информацию.

    Все директивы вставляются внутрь тэгов HTML-комментариев, что позволяет клиенту, в случае, если сервер не поддерживает SSI, игнорировать эти директивы. Директивы имеют следующий формат:

    Ниже следует список основных директив SSI и их параметров.

    echo Подставляет в документ значение указанной в качестве параметра переменной окружения (см. также список CGI-переменных) или специальной переменной SSI (см. ):

    Вы пришли на сервер, находящийся по адресу ...

    include Вставляет в документ текст другого файла. Параметры: file - указывает путь к вставляемому файлу относительно расположения данного документа; virtual - указывает виртуальный путь (как он указывался бы в URL) к вставляемому файлу.

    Эта директива очень удобна для создания стандартных шапок и подвалов веб-страниц.

    fsize Вставляет размер указанного в параметре файла (путь к файлу виртуальный):

    Размер файла archive.zip - bytes.

    flastmod Вставляет в документ дату и время последней модификации указанного в параметре файла (путь к файлу виртуальный):

    Дата последнего изменения: bytes. Формат вывода даты и времени может быть специфицирован параметром timefmt директивы config .

    exec Выполняет внешнюю программу, указанную параметром, и вставляет вывод этой программы в документ. Параметры: cmd - выполняемая программа является неким обычным приложением; cgi - выполняемая программа является CGI-скриптом

    На эту страницу заходили раз. В первом примере используется подстановка значений переменных окружения (см. CGI-переменные).

    config Модифицирует различные аспекты работы SSI. Параметры:

    • errmsg - сообщение об ошибке, выдаваемое при невозможности выполнить директиву:
    • sizefmt - устанавливает формат вывода размера файла (подставляемого директивой fsize ; значения: bytes - выводит в байтах; abbrev - округляет до целого числа килобайт. Размер файла archive.zip - примерно bytes.
    • timefmt - устанавливает формат вывода даты и времени, подробнее см. .

    Специальные переменные SSI

    Ниже приведены переменные SSI, которые можно использовать в директиве echo в дополнение к переменным CGI.

    DOCUMENT_NAME Имя данного документа. Например:

    Вы читаете файл под названием:

    DOCUMENT_URL Виртуальный путь к данному документу. Например:

    QUERY_STRING_UNESCAPED Декодированные данные из QUERY_STRING (см " "), при этом все метасимволы шелла экранированы обратным слэшем (\).

    DATE_LOCAL Текущие дата и время по местному времени. Например:

    Сейчас

    DATE_GMT Текущие дата и время по Гринвичу.

    LAST_MODIFIED
    Дата и время последней модификации данного документа. Например:

    Этот файл был последний раз изменен

    Задание

    Написать CGI-скрипт для игры в виселицу (угадывание слова по буквам).

    Правила игры

    Сервер загадывает слово из словаря и показывает его пользователю в замаскированном виде (буквы заменены звездочками). Пользователь имеет некоторое число попыток; во время каждой попытки он может угадать одну букву. Если пользователь правильно угадывает букву или называет букву, которую он уже использовал, попытка не засчитывается. Иначе число попыток уменьшается на единицу.

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

    Игра прекращается, если число попыток стало равным нулю (пользователь проиграл) или если угаданы все буквы в слове (пользователь выиграл).

    Если пользователь на какой-либо попытке предлагает более одной буквы, считается, что пользователь пытается угадать слово целиком. При верной догадке пользователь выигрывает, иначе проигрывает независимо от числа оставшихся попыток.

    Реализация

    Слова выбираются случайным образом из заданного текстового файла.

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

    При первом обращении к скрипту выдается заставка и регистрационная форма вида.

    Статья гуляет в интернете уже довольно давно, но, как автор думаю имею право на ее перепост здесь. Многое (если не все) написаное здесь устарело, и может показаться бесполезным с первого взгляда, однако пройдя этот путь, спустя 6 лет могу сказать, это не оказалось лишним. Итак.
    В этой статье я хочу рассказать о CGI интерфейсе вообще, его реализации для windows и использовании при написании CGI-программ языка ассемблер в частности. В рамки этой статьи не входит полное описание CGI, так-как в Интернете материала по этому вопросу просто море и пересказывать все это здесь я просто не вижу смысла.

    Теория CGI
    CGI – (Common Gateway Interface) – Общий Шлюзовый Интерфейс. Как не трудно догадаться интерфейс этот служит шлюзом между сервером (здесь я подразумеваю программу - сервер) и какой-либо внешней программой написанной для ОС на которой этот самый сервер запущен. Таким образом CGI отвечает за то, каким именно образом данные будут переданы от программы-сервера к CGI-программе и обратно. Интерфейс не накладывает никаких ограничений на то, на чем должна быть написана CGI-программа, это может быть как обычный исполнимый файл, так и любой другой файл – главное, чтобы сервер смог его запустить (в среде windows это например может быть файл с расширением, привязанным к какой-либо программе).
    С момента когда Вы вызвали (например нажали кнопку формы, к которой привязан вызов CGI-программы) CGI-программу до получения вами результата в окно браузера происходит следующее:
    - Вэб-клиент (например браузер) создает подключение к серверу, указанному в URL;
    - Вэб-клиент посылает запрос серверу, запрос этот обычно делается с помощью двух методов GET или POST;
    - Данные из запроса клиента (например значения полей формы) передаются сервером, используя CGI-интерфейс, CGI-программе, указанной в URL;
    - CGI-программа обрабатывает данные клиента, полученные от сервера и генерирует на основе этой обработки ответ клиенту, который она передает по все тому же CGI-интерфейсу серверу, а он в свою очередь передает его уже непосредственно клиенту;
    - Сервер разрывает соединение с клиентом.
    В стандартной спецификации CGI принято, что сервер может обмениваться с программой следующими способами:
    - Переменные окружения – они могут быть установлены сервером при запуске программы;
    - Стандартный поток ввода (STDIN) – с его помощью сервер может передать данные программе;
    - Стандартный поток вывода (STDOUT) – программа может писать в него свой вывод, передающийся серверу;
    - Командная строка – в ней сервер может передать некоторые параметры программе.
    Стандартные потоки ввода/вывода весьма удобны и широко используются на UNIX-системах, чего не скажешь о windows, поэтому существует спецификация CGI, разработанная специально для windows-систем так и называемая «Windows CGI». Но, естественно, и стандартные потоки ввода/вывода так же можно использовать в windows CGI программировании. Здесь я не буду затрагивать стандарт «Windows CGI», и на это существует по крайней мере две причины – первая, и самая главная – на данный момент не все http-сервера под windows поддерживают эту спецификацию (в частности мой любимый Apache 1.3.19). Вторую причину вы можете наблюдать набрав в любой поисковой системе строчку «Windows CGI». Отмечу относительно этого интерфейса лишь общие детали – все данные от сервера к клиенту передаются посредством обычного для windows *.ini файла, имя которого передается программе в командной строке. При этом все данные в файле уже заботливо разбиты по секциям сервером и вам лишь остается используя функции «GetPrivateProfile*» извлечь их оттуда. Ответ серверу передается опять же посредством файла, имя которого указано в соответствующей записи ini-файла.
    Какие же данные могут быть переданы клиентом CGI-программе? – практически любые. В общем случае программе передаются значения полей формы, которые заполняет клиент, но это также могут быть и какие-либо двоичные данные, например файл с картинкой или музыкой. Данные могут быть переданы на сервер двумя различными методами – это метод GET и метод POST. Когда мы создаем форму для заполнения на нашей страничке мы явно указываем каким из приведенных методов мы хотим отправить введенные пользователем данные, делается это в основном тэге формы примерно так:
    При отправке данных методом GET, данные браузером считываются из формы и помещаются следом за URL скрипта, за знаком вопроса, если значимых полей в форме несколько, то они передаются все через значёк «&», имя поля и его значение пишутся в URL через знак «=». Например запрос, сгенерированный браузером из формы при нажатии на кнопку, к которой привязан скрипт «/cgi-bin/test.exe», при учете что первое поле формы называется «your_name», второе – «your_age», может выглядеть так:
    GET /cgi-bin/test.exe?your_name=Pupkin&your_age=90 HTTP/1.0
    Использование метода GET имеет сразу несколько слабых сторон – первое и самое главное – т.к. данные передаются в URL то он имеет ограничение на количество этих самых передаваемых данных. Вторая слабость опять же вытекает из URL – это конфиденциальность, при такой передаче данные остаются абсолютно открытыми. Итак, хорошо если у нас в форме 2-3 небольших поля… встает вопрос что же делать если данных больше? Ответ – использовать метод POST!
    При использовании метода POST данные передаются серверу как блок данных, а не в URL, что несколько развязывает нам руки для увеличения объема передаваемой информации, для вышеприведенного примера формы POST блок, посылаемый серверу будет примерно такой:

    POST /cgi-bin/test.exe HTTP/1.0
    Accept: text/plain
    Accept: text/html
    Accept: */*
    Content-type: application/x-www-form-urlencoded
    Content-length: 36
    your_name=Pupkin&your_age=90

    Как уже говорилось выше, после получения данных сервер должен преобразовать их и передать CGI программе. В стандартной спецификации CGI введенные клиентом данные при запросе GET помещаются сервером в переменную среды программы «QUERY_STRING». При запросе POST данные помещаются в стандартный поток ввода приложения, откуда могут быть им считаны. Кроме того, при таком запросе сервером устанавливаются еще две переменные среды - CONTENT_LENGTH и CONTENT_TYPE, по которым можно судить о длине запроса в байтах и о его содержании.
    Помимо самих данных сервером устанавливаются и другие переменные окружения вызываемой программы, приведу некоторые из них:

    REQUEST_METHOD
    Описывает каким именно методом получены данные
    Пример:REQUEST_METHOD=GET

    QUERY_STRING
    Строка запроса, если использовался метод GET
    Пример:QUERY_STRING= your_name=Pupkin&your_age=90&hobby=asm

    CONTENT_LENGTH
    Длина в байтах тела запроса
    Пример:CONTENT_LENGTH=31

    CONTENT_TYPE
    Тип тела запроса

    GATEWAY_INTERFACE
    Версия протокола CGI
    Пример:GATEWAY_INTERFACE=CGI/1.1

    REMOTE_ADDR
    IP-Адрес удаленного хоста, то бишь клиента, нажавшего кнопочку в форме
    Пример:REMOTE_ADDR=10.21.23.10

    REMOTE_HOST
    Имя удаленного хоста, это может быть его доменное имя или например имя компьютера в среде Windows, если таковые получены быть не могут, то поле содержит его IP
    Пример:REMOTE_HOST=wasm.ru

    SCRIPT_NAME
    Имя скрипта, использованное в запросе.
    Пример:SCRIPT_NAME=/cgi-bin/gols.pl

    SCRIPT_FILENAME
    Имя файла скрипта на сервере.
    Пример:SCRIPT_FILENAME=c:/page/cgi-bin/gols.pl

    SERVER_SOFTWARE
    Программное обеспечение сервера
    Пример:Apache/1.3.19 (WIN32)
    Вызываемая CGI-программа может прочитать любую из переменных своего окружения, установленных сервером и использовать ее в своих интересах.
    В общем-то это вкратце все, для получения более подробной информации о Общем Шлюзовом Интерфейсе смотрите специализированную документацию, это описание я сделал для того, чтобы напомнить вам, а если не знали то ввести в курс дела. Давайте попробуем что-нибудь сделать на практике.

    Практическая часть
    Для практики нам понадобятся как минимум 3 вещи – какой-нибудь http-сервер для Windows, все примеры я пробовал на Apache 1.3.19 для Windows, сервер бесплатный, скачать его можно с i
    Да, и сервер нам понадобится не абы – какой, а настроенный для запуска cgi-скриптов! Как это делается для сервера используемого вами смотрите документацию. Вторая вещь, которая нам понадобится это, естественно, ассемблер, так же необходимо, чтобы компилятор поддерживал создание консольных WIN32 приложений, я использую Tasm, но прекрасно подойдут и Fasm и Masm и множество других *asm’ов. Ну и наконец самое главное, что потребуется это желание.
    Итак, я допускаю, что сервер был вами благополучно поставлен и настроен, так, что в корневой директории документов сервера лежит файлик index.html, который замечательно показывается в браузере, когда вы набираете адрес 127.0.0.1 . Так же я учту, что где-то в дебрях папок сервера существует папочка «cgi-bin», в которой разрешен запуск скриптов.
    Давайте проверим настройку сервера, а заодно и напишем небольшой скрипт. Скрипт наш будет обычным *.bat файлом. Предвижу вопросы – как? неужели? Да, это обычный командный файл, как уже говорилось выше спецификация CGI не делает различий между типами файлов, главное, чтобы сервер мог его запустить, а он в свою очередь, имел доступ к stdin/stdout и переменным окружения, bat-файл, пусть и не в полной мере, но для примера нас вполне устроит. Создадим файл примерно такого содержания:

    @echo off
    rem Заголовок апроса
    echo Content-type: text/html
    echo.
    rem Тело запроса
    echo "Привет!

    echo "С запросом GET пришли данные: %QUERY_STRING%

    Файл назовем test.bat и поместим его в директорию для запуска скриптов, скорее всего это будет директория «cgi-bin». Следующее, что нам нужно будет сделать, это каким либо образом вызвать этот скрипт, в принципе, сделать это можно напрямую набрав в окошке адреса браузера примерно следующее «http://127.0.0.1/cgi-bin/test.bat», но давайте сделаем его вызов с нашей главной странички, заодно проверим работу метода GET. Создадим в корне сервера файл index.html со следующим содержанием:

    Введите данные для передачи серверу:
    Данные:

    Теперь при входе на сервер (http://127.0.0.1 в строке адреса браузера) должна появиться форма, наберите в ней что-нибудь и нажмите кнопку «послать», если все было сделано правильно, Вы увидите в окне браузера ответ нашего bat-скрипта. Теперь давайте посмотрим что же мы там намутили.
    Как можно догадаться команда «echo» осуществляет вывод в stdout, первым делом мы передаем серверу заголовок нашего ответа – «echo Content-type: text/html». Это есть стандартный заголовок спецификации CGI, говорящий о том, что передавать мы хотим текст или документ html, существуют и другие заголовки. Очень важный момент – заголовок должен отделяться от тела ответа пустой строкой, что мы и делаем следующей командой «echo.». Дальше передается тело самого ответа – это обычный html-документ, в теле документа я для наглядности отображая одну из переменных среды, переданной нам сервером – «QUERY_STRING», как уже говорилось при методе GET (а это именно наш случай) в этой переменной передаются все введенные пользователем данные, что мы и можем наблюдать в ответе скрипта. Вы могли заметить «кавычки не к месту» в последних 2-х строках файла, сразу после «echo», стоят они там из-за специфичности bat-файлов, как можно заметить тэги html обрамляются символами «<» и «>», в тоже время эти символы служат перенаправлением ввода/вывода в bat-файлах, а посему мы не можем их здесь свободно использовать.
    Рекомендую немного побаловаться с подобными bat-скриптами, это бывает очень полезно, попробуйте посмотреть другие переменные окружения. Немного скажу, отступив от темы, на UNIX-системах языки командных интерпретаторов очень сильно развиты и грань между программированием на языке командного интерпретатора и программированием на «реальном» языке программирования весьма и весьма размыта в некоторых случаях, поэтому на UNIX-системах частенько простенькие скрипты пишутся именно на языках командных интерпретаторов, но windows-интерпретатор cmd.exe или, ранее, command.com явно слабоваты для этих целей.
    Теперь перейдем к самой главной задаче этой статьи, к собственно написанию CGI-программы на ассемблере. В принципе, если учесть все вышесказанное о CGI мы можем сделать вывод о том, что требует CGI-интерфейс от нашей программы:

    • Программа должна уметь читать стандартный поток ввода (stdin), чтобы получить доступ к данным, переданным методом POST;
    • Программа должна уметь писать в стандартный поток вывода (stdout), чтобы передать результат своей работы серверу;
    • Из первых двух пунктов следует, то, что для того, чтобы сервер мог передать нашей программе что-либо в stdin, а она могла ему что-либо ответить в stdout CGI-программа должна быть консольным приложением;
    • Наша программа должна уметь читать переменные своего окружения.
    Этого вполне достаточно для создания полноценного CGI-приложения.
    Начнем с последнего пункта. Для получения доступа к переменным окружения Windows-приложения используется функция API «GetEnvironmentStrings», функция не имеет аргументов и возвращает указатель на массив переменных окружения (ИМЯ=ЗНАЧЕНИЕ) разделенных между собой нулем, массив закрывается двойным нулем, при запуске программы сервером в окружение программы помимо стандартных переменных добавляются специфические CGI-переменные, описанные выше, при запуске программы из командной строки вы их не увидите, естественно.
    Для того, что бы писать что-то в stdout или читать из stdin сначала мы должны получить хэндлы этих потоков, делается это с помощью функции API «GetStdHandle», в качестве параметра функции передается одно из следующих значений:
    • STD_INPUT_HANDLE - для stdin (стандартный ввод);
    • STD_OUTPUT_HANDLE - для stdout (стандартный вывод);
    • STD_ERROR_HANDLE - для stderr.

    Функция возвратит необходимый нам для операций чтения/записи хэндл. Следующее что нам необходимо делать это писать/читать эти потоки. Делается это обычными операциями чтения/записи файлов, т.е. ReadFile и WriteFile. Тут есть одна тонкость, можно подумать, что для этих целей можно использовать WriteConsole/ReadConsole, да это действительно справедливо для консоли и будет прекрасно работать, результаты, так же как и с WriteFile будут выводиться на консоль, но продолжаться это будет пока мы не запустим нашу программу как скрипт на сервере. Происходит это потому что, когда нашу программу запускает сервер хндлы, возвращаемые функцией «GetStdHandle» уже не будут хндлами консоли как таковыми, они будут хэндлами pipe, что необходимо для связи двух приложений.
    Вот небольшой пример того, как должна выглядеть CGI-программа на ассемблере:

    386
    .model flat,stdcall
    includelib import32.lib
    .const
    PAGE_READWRITE = 4h
    MEM_COMMIT = 1000h
    MEM_RESERVE = 2000h
    STD_INPUT_HANDLE = -10
    STD_OUTPUT_HANDLE = -11

    Data
    hStdout dd ?
    hStdin dd ?
    hMem dd ?
    header:
    db "Content-Type: text/html",13,10,13,10,0
    start_html:
    db "Окружение CGI-программы выглядит так:
    ",13,10,0
    for_stdin:
    db "STDIN программы содержит:
    ",13,10,0
    end_html:

    Db "",13,10,0
    nwritten dd ?
    toscr db 10 dup (32)
    db " - Тип файла",0
    .code
    _start:

    Xor ebx,ebx
    call GetStdHandle,STD_OUTPUT_HANDLE
    mov hStdout,eax
    call GetStdHandle,STD_INPUT_HANDLE
    mov hStdin,eax

    Call write_stdout, offset header
    call write_stdout, offset start_html

    Call VirtualAlloc,ebx,1000,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE
    mov hMem,eax
    mov edi,eax
    call GetEnvironmentStringsA
    mov esi,eax
    next_symbol:
    mov al,
    or al,al
    jz end_string
    mov ,al
    next_string:
    cmpsb
    jmp short next_symbol
    end_string:
    mov ,">rb<"
    add edi,3
    cmp byte ptr ,0
    jnz next_string
    inc edi
    stosb
    call write_stdout, hMem
    call write_stdout, offset for_stdin

    Call GetFileSize,,ebx
    mov edi,hMem
    call ReadFile,,edi, eax,offset nwritten, ebx
    add edi,
    mov byte ptr ,0
    call write_stdout, hMem
    call write_stdout, offset end_html
    call VirtualFree,hMem
    call ExitProcess,-1

    Write_stdout proc bufOffs:dword
    call lstrlen,bufOffs
    call WriteFile,,bufOffs,eax,offset nwritten,0
    ret
    write_stdout endp
    extrn GetEnvironmentStringsA:near
    extrn GetStdHandle:near
    extrn ReadFile:near
    extrn WriteFile:near
    extrn GetFileSize:near
    extrn VirtualAlloc:near
    extrn VirtualFree:near
    extrn ExitProcess:near
    extrn lstrlen:near
    ends
    end _start

    Исполняемый файл строится командами:
    tasm32.exe /ml test.asm
    tlink32.exe /Tpe /ap /o test.obj
    Не забудьте, что программа должна быть консольной.
    Вызывать эту программу можно используя вышеописанную html-форму, нужно только поменять имя test.bat в форме на test.exe и скопировать его в /cgi-bin/ соответственно, при том можно выставить в методе запроса POST, программа его обрабатывает.
    Еще хочу отметить, что можно вызывать программу и по-другому, можно создать в каталоге cgi-bin файл например test.cgi с одной единственной строчкой «#!c:/_путь_/test.exe» и вызывать в запросах его, а сервер в свою очередь будет читать первую его строчку и запускать exe-файл, для этого необходимо, чтобы в настройках http-сервера было прописано расширение *.cgi как расширение для скриптов. При таком подходе сервер запустит нашу программу с командной строкой «test.exe путь_к_test.exe» это имеет несколько плюсов – первое, это то, что человек, запускающий наш скрипт не будет даже догадываться на чем скрипт написан, второе – так-как нам передается имя файла с нашей строчкой мы можем например дописать в этот файл какие-либо настройки для нашего скрипта, что упрощает отладку, кстати именно так работают все интерпретаторы – вы успели заметить, что во всех perl/php/итд программах, присутствует подобная строка – указывающая на сам командный интерпретатор. Так вот сервер при запуске cgi-программы, если расширение программы прописано у него как скрипт в настройках читает первую строку файла, и если она оказывается описанного выше формата, то запускает указанную в строчке программу с именем этого файла ч/з пробел, допустим что в строчке указан интерпретатор перла, он получив такой подарок начинает его выполнение, т.к. комментарий в перле это символ «#», то первую строчку он пропускает и идет дальнейшее выполнение скрипта, в общем штука удобная.

    Наша компания предлагает вам сделать вместе с нами первый шаг навстречу счастливой полноценной жизни.Помогут вам в этом препараты, которые мы предлагаем:

    • -дженерики: , Левитры и Сиалиса, а также Попперсы сделают сексуальную сторону вашей жизни яркой и насыщенной
    • -синтетические гормоны роста : Динатроп, Ансомон и Гетропин добавят силы, энергии спортсменам и решат проблемы лишнего веса
    • -препараты и БАДы: Мориамин Форте, Tribulus terrestris, Экдистерон и Guarana вернут вам утраченную энергию, повысят выносливость организма, омолодят кожу, и восстановят работу многих внутренних органов.

    Почему мы предлагаем покупать именно у нас? Причин несколько:

    • -наша компания является первым и пока единственным в России официальным представителем по продаже дженериков , силденафила, и дистрибьютором других препаратов
    • -качество наших товаров гарантируется официальными поставками препаратов
    • -для покупателей, которые смущаются от одной мысли, что слово « Виагра» в аптеке нужно будет произнести вслух, анонимный заказ товара на сайте отличная возможность приобрести нужный препарат
    • -удобная и быстрая курьерская доставка в Москве и Санкт-Петербурге, возможна почтовая рассылка препаратов в другие регионы

    Покупать у нас выгодно

    • !мы постоянно проводим новые акции, позволяющие покупать дженерики Левитры, Сиалиса и Силденафил и другие по очень выгодным ценам
    • !каждому новому покупателю компания дарит дисконтную карту постоянного покупателя для приобретения препаратов с 10%-ной скидкой
    • !при заказе товара на сумму более 5 тысяч рублей, вас ждет подарок - бесплатная доставка
    • !для оптовых покупателей возможны закупки по специальным ценам при сравнительно небольших партиях товара с выпиской товарного чека
    • !участие в партнерской программе дает вам еще одну весомую скидку на стоимость товара в размере 40%

    Наши сотрудники прилагают максимум усилий для того, чтобы сделать приобретение препаратов максимально удобным для покупателя

    доставка товаров производится без выходных и праздничных дней до 24 часов. Для VIP клиентов: Сиалис и другие препараты для потенции, а так же доставляются круглосуточно
    оплата принимаются через электронные платежные системы Яндекс Деньги, Web Money и с банковских карт Master Card или Visa для бесплатной консультации в любое время можно обратиться » по многоканальным телефонам:

    • 8 (800 )200-86-85 (по России звонок бесплатный),
    • +7 (800 )200-86-85 (Санкт-Петербург)
    • +7 (800 )200-86-85 (Москва)
    Обязательно назовите добавочный номер: 1275

    Индия дешевый сиалис inurl read cgi board

    Если внимательно прочитать Сиалис описание, становится понятно - это не возбуждающее средство, это препарат не для повышения либидо. Дозировка Мужчинам среднего возраста рекомендуется принимать в дозе 20 мг как минимум за 16 мин до предполагаемой сексуальной активности независимо от приема пищи. Никаких гормонов, никаких возбуждающих средств. Но даже при наличии таких заболеваний препарат Сиалис принимать можно. Пациенты могут осуществлять попытку полового акта в любое время в течение 36 ч после приема для того, чтобы установить оптимальное время ответа на прием тадалфила. На обратной стороне находится информация о сроке годности и о составе препарата. Если вам нужен дженерик Сиалис, вы всегда сможете заказать его в нашей аптеке. Какие противопоказания у медикамента Сиалис? Несвоевременное лечение приапизма приводит к повреждению тканей полового члена, в результате этого может наступить долговременная потеря потенции. Противопоказания Одновременный прием препаратов, содержащих любые органические нитраты; детский и подростковый возраст до 18 лет; повышенная чувствительность к тадалафилу. Фармакокинетика После приема внутрь тадалафил быстро всасывается. Как результат - медикамент действует в течение 36 часов! В нашей аптеке сиалис, цена в Украине на который очень демократична, можно купить в любое время суток. Производство: Индия Подарок: 5 таб Дженерик Сиалис при заказе от 20 таб Бесплатный самовывоз м.