getenv (QUERY_STRING) в C CGI - PullRequest
       6

getenv (QUERY_STRING) в C CGI

2 голосов
/ 13 октября 2010

C файл:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
  FILE *ptr;
  char m[200];
  char *data = malloc(200);
  data=getenv("QUERY_STRING");
  sscanf(data,"%s", m);
  printf("%s", m);
  ptr=fopen("c:/test.txt", "w");
  fprintf(ptr, "%s", m);
  fclose(ptr);
  return 0;
}

// gcc -g print.c -o print.exe

HTML-файл:

<html>
  <body>
    <h2>CGI Server</h2>
    <p>
      <form action="http://localhost/cgi-bin/print.exe">
    <div><label>value: <input name="m" size="10"></label></div>
    <div><input type="submit" value="Run"></div>
      </form>
    </p>
  </body>
</html>

Если в форме веб-страницы введены данные c: /data.txt, то результатом будет: c% 3A% 2Fdata.txt

Что случилось? Почему / и: повреждены на выходе? похоже, проблема в QUERY_STRING, потому что getenv ("PATH") не представляет этой проблемы.

Ответы [ 3 ]

6 голосов
/ 13 октября 2010
  char *data = malloc(200);
  data=getenv("QUERY_STRING");

Утечка памяти здесь. Вы выделяете 200 байтов, которые никогда не будете использовать или не сможете free(). (Или нет, поскольку malloc() может завершиться с ошибкой и вернуть NULL.)

  char m[200];
  sscanf(data,"%s", m);

Это грубая замена для strcpy() / strncpy(). Результатом является переполнение буфера, если длина строки запроса превышает 200 символов. Также завершается, как только он находит пробелы, но это не проблема, потому что они были превращены в + или %20 во время кодирования URL.

  ptr=fopen("c:/test.txt", "w");
  fprintf(ptr, "%s", m);

fopen() может завершиться ошибкой, в результате чего возвращается значение NULL.

Я предлагаю вам ознакомиться с указателями и распределением памяти, посмотреть некоторые функции манипуляции со строками, отличные от printf / scanf, а также выработать привычку проверять наличие ошибок, то есть защищаться от кодирования. Даже в небольшом, качественном коде.

4 голосов
/ 13 октября 2010

«Проблема» связана с URL-кодировкой . Вам нужно будет URL-декодировать значение, которое вы получите из QUERY_STRING.

1 голос
/ 13 октября 2010

Тип %3A - это шестнадцатеричное кодирование символов HTTP, которое может быть специальным. Это как экранирование символа кавычки в строке C. "\""

Переменная среды PATH не имеет ничего общего с HTTP, поэтому она не применяется. Программа веб-сервера устанавливает для параметра QUERY_STRING значение, отправленное веб-браузером, в котором содержится шестнадцатеричная кодировка%.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...