Html 基于C分割错误的CGI
我再说一遍:p,无论如何,我一直在开发一个C程序,允许用户登录到一个网站,非常基本 然而,我的代码给了我一个分段错误 信息通过HTMLPOST传递到C,然后作为 用户名密码 当从站点运行它时,我会得到过早结束的脚本头,当从bash运行时,我会得到分段错误 这是我的密码:Html 基于C分割错误的CGI,html,c,login,segmentation-fault,cgi,Html,C,Login,Segmentation Fault,Cgi,我再说一遍:p,无论如何,我一直在开发一个C程序,允许用户登录到一个网站,非常基本 然而,我的代码给了我一个分段错误 信息通过HTMLPOST传递到C,然后作为 用户名密码 当从站点运行它时,我会得到过早结束的脚本头,当从bash运行时,我会得到分段错误 这是我的密码: #include <stdlib.h> #include <string.h> #include <stdio.h> int main(void){ char* s = malloc(
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(void){
char* s = malloc(100 * sizeof(char));
char* s2 = malloc(100 * sizeof(char));
int a=0;
printf("Content-type: text/html;charset=utf-8\n\n");
printf("<html>\n");
printf("<body>\n");
printf("<h1>Form Feedback</h1>\n");
int n = atoi(getenv("CONTENT_LENGTH"))+1;
char theString[n];
fgets(theString, n, stdin);
// theString = getenv("QUERY_STRING");
if(theString == NULL){
printf("<h2>Error</h2>\n");
return 0;
}
char parseValue[] = "&";
char* str = strtok(theString, parseValue);
// str = strtok(NULL, parseValue);
sscanf(str, "name=%s", s);
for (a=0; a<strlen(s); a++){
if(s[a]=='+'){
printf("<p>Please only use alfanumeric characters</p>");}
}
// str = strtok(NULL, parseValue);
sscanf(str, "password=%s", s2);
for (a=0; a<strlen(s2); a++){
if(s2[a]=='+'){
printf("<p>Please only use alfanumeric characters</p>");}
}
printf("<br><br><h1>REGISTRATION COMPLETE</h1>");
printf("</body>");
printf("</html>");
FILE *file;
file=fopen("members.ssv", "a+");
if(file==NULL){return 1;}
sprintf(str,"%s %s\n",s,s2);
fwrite(str,1,sizeof(str),file);
fclose(file);
return 0;
}
#包括
#包括
#包括
内部主(空){
char*s=malloc(100*sizeof(char));
char*s2=malloc(100*sizeof(char));
int a=0;
printf(“内容类型:text/html;charset=utf-8\n\n”);
printf(“\n”);
printf(“\n”);
printf(“表单反馈”);
int n=atoi(getenv(“内容长度”)+1;
字符串[n];
fgets(管柱,n,标准尺寸);
//字符串=getenv(“查询字符串”);
if(字符串==NULL){
printf(“错误\n”);
返回0;
}
字符解析值[]=“&”;
char*str=strtok(字符串,parseValue);
//str=strtok(NULL,parseValue);
sscanf(str,“name=%s”,s);
对于(a=0;a您没有指出代码的哪一部分导致了segfault,也许您还没有弄清楚,但是从前面开始,我发现这些事情值得怀疑:
sprintf(str,“…”,…);//从末尾算起的第五行。**已编辑
此时,s指向strtok的一个小标记。内部内容不太清楚。您应该只将sprintf()转换为您知道的大小。这很可能是罪魁祸首
也有可能strtok没有以您期望的方式对字符串进行nul终止;可能它永远不会终止,或者您期望的下一个标记不存在。您自己是否测试过strtok(),sscanf()方法?建议使用memset()'将整个s和s2缓冲区设置为'\0'
此外,将密码以字符串形式存储在任何位置都是仅供参考,(字符串==NULL)
永远不会为真。您确实应该检查库调用的成功/失败(在本代码中只执行一次)或(请参阅戒律6)谢谢,我会努力的,我知道这只是为了让我们熟悉CGI和HTMLH的课堂作业。我该如何修复sprintf?因为s处的值应该是USERNAME,s2应该是password no?如果不是,那就是我需要它们的最后一件事,我想fgets可能有问题(字符串,200,stdin);这就是程序暂停的地方。很抱歉,我键入了我从您那里引用的行。现在已更正。您有sprintf()到*str,它是您在strtok()中创建为指向子字符串的指针的。strtok()只保证您从中获得的是有效的子字符串,因此您将不会指示其分配的大小,并且可能不一定具有写入它的权限(仅读取它)。