Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > C++ as CGI


Автор: Opik 8.9.2005, 15:02
Пытаюсь писать на C++ по веб, только учусь. smile
Вот накидал:
Код

#include <stdio.h>
#include <string.h>

int main(int args, char *argv[])
{
      printf("Content-Type: text/html\n\n");
      char out[10000];
      char buff[1000];
      strcpy(out, "");
      for(int i = 0; i < args; i++)
      {
            sprintf(buff, "arg num: %d; arg value: %s<br />\n", i, argv[i]);
            strcat(out, buff);
      }
       printf("%s\n", out);
return 0;
}

http://selecter.vnet.ee/~opik/cgi-bin/test.cgi?
вот пример
http://selecter.vnet.ee/~opik/cgi-bin/test.cgi?test
всё ок
http://selecter.vnet.ee/~opik/cgi-bin/test.cgi?test=query
уже нету второго запроса... что не так? и как можно добиться нужного эффекта и есть ли ошибки в коде?

Автор: Mad 8.9.2005, 15:51
Цитата(Opik @ 8.9.2005, 14:02)
      printf("Content-Type: text/html\n\n");

это тебе не DOS smile в юниксе \n это 0x0a а тебе надо 0x0d 0x0d 0x0a т.е. строка должна быть
Код

 printf("Content-Type: text/html\r\r\n\r\r\n");

Автор: Opik 8.9.2005, 17:19
Mad
Спасибо.
А по сути вопроса?

Автор: Mad 8.9.2005, 17:56
Opik
посмотри man по cgi.h или cgi.lib
(щас винда стоит так что сам посмотреть не могу)

Автор: saa 8.9.2005, 20:01
2 Opik

Для того, чтобы получить параметры, переданные задаче методом GET, необходимо получить значение переменной окружения QUERY_STRING.

Автор: Opik 9.9.2005, 12:05
Цитата
Для того, чтобы получить параметры, переданные задаче методом GET, необходимо получить значение переменной окружения QUERY_STRING

да, это хорошо, но как это сделать? smile какой хеадер нужно подключать для работы getenv?
Добавлено @ 12:08
Нашел smile)
#include <iostream>
#include <cstdlib>

теперь как я понял нужно распарить QUERY_STRING?

Автор: nerezus 3.10.2005, 17:06
Код


#include <cstdlib>
#include <iostream>

// nerezus, 2005

using namespace std;

char * query();
char * remote_addr();
void UrlDecode(char * st);


char * query() {
     char *tempo = malloc(strlen(getenv("QUERY_STRING"))+1);
     strcpy(tempo, getenv("QUERY_STRING"));
     UrlDecode(tempo);
     return tempo;
     }


char * remote_addr() {
     return getenv("REMOTE_ADDR");
     }


char * content_length() {
     return getenv("CONTENT_LENGTH");
     }


void UrlDecode(char * st) {
     char *p=st;
     char hex[3];
     int code;
     do {
         if ( *st == '%') {
              hex[0]=*(++st); hex[1]=*(++st); hex[2]=0; 
              sscanf(hex, "%X", &code);
              *p++=(char) code;}
         else if ( *st == '+') *p++=' ';
         else *p++=*st;
         } while ( *st++ != 0 ); 
     }


int main(int argc, char *argv[])
{
    cout << "Content-type: text/html\n\n";
    
    char *q = query();
    cout  << "You typed <font color=blue> " << q << " </font> in your query <br>\n";
    char *ip = remote_addr();
    cout  << "Your ip is <font color=blue> " << ip << " </font><br>\n";
    
    return EXIT_SUCCESS;
}



2Mad: про \n ты не прав.

Автор: Гость_stalker 4.10.2005, 14:17
Opik, опасно пишешь smile попробуй вот такой url забить:
http://selecter.vnet.ee/~opik/cgi-bin/test.cgi?12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
как минимум узнаешь версию сервера ну ещё кой чего помаленьку.
А там можно уже и эксплоит подыскать подходящий.

Автор: Guest 6.10.2005, 02:16
int main (int argc, char **argv, char **envp);

envp = environment parameters

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)