Форум о защите от: хакеров, взлом, раскрутка, хакер, вирусы, взлом программы, взлом паролей, взлом вконтакте, взлом icq, раскрутка сайта, взлом скачать, взлом почты, взлом ru, проги взлома, хакер, программа взлома, трояны, программирование

Хакер, взлом, программа, сайт, форум, информатика, железо, разгон, раскрутка, SEO, защита, безопасность, взломать, как взломать, взлом icq, взлом вконтакте, взлом программ, одноклассники, взлом почты, взлом аськи
Текущее время: 03-05, 14:23

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Написание CGI-программы на C++
СообщениеДобавлено: 10-12, 20:11 
Не в сети
<b><font color=red>Admin</font></b>
Аватара пользователя

Зарегистрирован: 22-05, 15:38
Сообщения: 1901
Иногда случается, что для написания движка, работающего с Web, интерпретируемые языки типа PHP/Perl/ASP не подходят. Это бывает когда, например, требуется высокопроизводительная CMS или что-то низкоуровневое (например, сбор данных с веб-камеры). Конечно, существуют такие языки как C#, но иногда для небольших проектов их применение не окупит затраты.

Поэтому первое, что следует знать для написания таких программ – как в общих чертах устроен интерфейс CGI. О самом интерфейсе вы можете прочесть из Википедии, я же просто приведу пример реализации простейшей cgi-программы типа PE/ELF.

#include
#include
#include // без расширения, подключает класс std::string
#include // strlen, strcat, strncpy, ...

using std::string;
using std::cout;
using std::cin;
using std::endl;

int main(int argc, char *argv[])
{
string POST_data;
string QUERY_STRING;
cout << "content-type: text/plain; charset=windows-1251" << endl << endl;
char* var = 0;
var = getenv("CONTENT_LENGTH");
if ((var != 0) && (var) != "0")
{
int post_length = atoi(var);
free(var); var = 0;
cout << "POST data: n";
var = (char*)malloc(post_length+1);
cin.get(var, post_length+1);
cout << var;
free(var);
}
var = getenv("QUERY_STRING");
if (var)
{
QUERY_STRING = var;
free(var); var = 0;
cout << endl << "QUERY_STRING: " << QUERY_STRING << endl;
}
return EXIT_SUCCESS;
}


Как видите, для упрощения работы со строками используется класс string из библиотеки std.

Первым делом cgi-программа должна отправить заголовки. В нашем случае здесь все просто: content-type задает тип передаваемой информации (в данном случае, обычный текст), после чего идут два символа новой строки. Если не передать заголовок, сервер выдаст ошибку 'Internal Server Error'. Как вы уже поняли, отправлять все данные нужно в стандартное устройство вывода (да, кстати, приложение должно быть консольным).

Далее, необходимо научиться считывать полученные от сервера данные и переменные окружения. Значение конкретной переменной окружения можно получить используя функцию getenv(const char* имя_переменной). Эта функция вернет 0, если переменной не существует.

Чтобы узнать, какие переменные сервер передал скрипту, можно использовать следующую конструкцию:

extern char** environ; // Глобальная переменная, объявляется в начале модуля

for (int i=0; environ[i] != 0; i++)
printf(“%sn”, environ[i]);

Внешняя переменная environ стандартизирована POSIX и доступна на большинстве платформ и операционных систем (совместимых с POSIX).

Те параметры, которые передаются через URI, могут быть найдены в переменной QUERY_STRING.

С методом POST дело обстоит несколько сложнее. Сначала мы должны узнать длину данных. Она хранится в переменной CONTENT_LENGTH в виде строки с числом. К счастью, в библиотеке С/C++ есть функция atoi, которая умеет переводить строку в число.

После того, как длина данных известна, мы просто считываем содержимое стандартного устройства ввода (им будет не клавиатура, а канал между web-сервером и cgi-программой)

Данные, хранящиеся в QUERY_STRING и в потоке стандартного ввода зашифрованы так называемым urlencode. Поэтому следующим шагом станет дешифровка и разбор всех параметров, чем наша небольшая программа заниматься не станет.

Так как мы написали CGI-программу, то для её тестирования вам понадобится Web-сервер. Можете использовать свой, а можно и на хостинге (если, конечно, он позволяет выполнение программ, а не только скриптов). Для тестирования необходимо скопировать программу в папку cgi-bin на сервере или любую другую, допускающую выполнение сценариев. И придется написать небольшую html-страницу, чтобы было удобнее посылать POST-запросы:
<*html>
<*head>
<*meta http-equiv="content-type" content="text/html; charset=windows-1251">
<*title>Test Page
<*/head>
<*body>
<*form method="post" action="cgi-bin/cgi.exe?id=1" name="myform">
<*p>Entry text:<*/p>
<*input type="text" name="mytext" value="">
<*input type="submit">
<*/form>
<*/body>
<*/html>

Измените путь к cgi-программе и запустите страницу на сервере через браузер (не локально сохраненный html, а именно на сервере).

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

Цель этой статьи достигнута – вы теперь знаете, как получить данные от сервера (а может быть знали и до этого :))

By MBR, 2008


MBR


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by Forumenko © 2006–2014
Русская поддержка phpBB