我正在使用 C 处理 CGI 文件,该文件仅在请求方法为 POST 时才执行。
int main(void)
{
char *method_str = getenv("REQUEST_METHOD");
int iMethod = strcmp(method_str,"POST");
int tid = 0;
int own_id = 0;
char key[16] = "\0";
if (iMethod == -1) {
puts("Location:start.cgi\n\n");
} else if (iMethod == 0) {
char *data = getenv("CONTENT_LENGTH");
int size = atoi(data);
char *buffer = malloc((size+1)*sizeof(char));
fgets(buffer,atoi(data)+1,stdin);
int counter = count(buffer);
char **names = malloc(counter*sizeof(char *));
char **values = malloc(counter*sizeof(char *));
parse(buffer, names, values);
int isDel = strcmp(*(values+1),"Back to Start");
if (isDel == 0) startpage(atoi(*values));
else {
own_id = atoi(*values);
sprintf(key,"%s",*(values+1));
int stat = login_status(own_id,key);
if (stat == -1) {
startpage(0);
} else userpage(own_id);
}
free_mallocs(names,values,counter);
free(buffer);
}
free(method_str);
return 0;
}
在 gdb 中运行 CGI 文件告诉我问题出在以下行:
int iMethod = strcmp(method_str,"POST");
. 错误是 SIGSEGV。
当我从 XAMPP 服务器打开 CGI 时,它运行良好。但是,当我在与我不同的 Ubuntu 服务器上运行它时,会出现错误 500。我尝试将 的值getenv("REQUEST_METHOD")
与 NULL 进行比较,gdb 告诉我文件运行正常。但是,CGI 文件在我的 XAMPP 服务器和另一台服务器上都无法正常运行,两者都显示错误 500。我可以告诉您的是,这些函数设置了它们的 Content 标头。函数 count() 和 parse() 被适当地设置并且独立于手头的情况。提前致谢。
更新:如果用户直接打开 CGI 文件,浏览器将重定向到另一个 CGI 文件。