C CGI中的getenv(QUERY_STRING)

时间:2010-10-12 22:24:09

标签: html c cgi

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 个答案:

答案 0 :(得分:6)

  char *data = malloc(200);
  data=getenv("QUERY_STRING");

这里有内存泄漏。您正在分配200个字节,您将永远不会使用或能够free()。 (或者不是,malloc()可能会失败并返回NULL。)

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

这是strcpy() / strncpy()的粗略替代品。如果查询字符串长度超过200个字符,则导致缓冲区溢出。一旦找到空格也会终止,但这不是问题,因为在URL编码期间他们已经转为+%20

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

fopen()可能会失败,导致返回值为NULL

我建议你查看指针和内存分配,查找除printf / scanf之外的一些字符串操作函数,并养成检查错误的习惯,即防御性编码。即使是小型的,示例质量的代码。

答案 1 :(得分:4)

“问题”归因于URL-encoding。您需要对从QUERY_STRING获得的值进行URL解码。

答案 2 :(得分:1)

%3A类型的东西是字符的HTTP十六进制编码,可能是特殊的。这就像在C字符串中转义引号字符一样。 "\""

PATH环境变量与HTTP无关,因此不受影响。您的Web服务器程序正在将QUERY_STRING设置为Web浏览器发送的内容,其中包含%十六进制编码。