CGI с использованием ошибки сегментации C
Я снова:P, во всяком случае, я работал над программой на C, чтобы позволить пользователям входить на сайт, очень простой.
Мой код, однако, дает мне ошибку сегментации.
Информация передается через HTML POST на C, который затем сохраняется в файле.ssv как ПАРОЛЬ ИМЯ ПОЛЬЗОВАТЕЛЯ.
При запуске с сайта я получаю преждевременное завершение заголовков скриптов, а при запуске из bash - ошибка сегментации.
Вот мой код:
#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;
}
Большое спасибо, если вы можете помочь, я застрял на несколько дней.
РЕДАКТИРОВАТЬ: я исправил ошибку сегмента и преждевременный конец заголовков скриптов. ОДНАКО, когда я смотрю на мой файл members.ssv, я получаю что-то вроде
НАЧАЛО ФАЙЛА:пусто* пусто * @R
Понятия не имею почему!
1 ответ
Вы не указали, какая часть вашего кода вызывает segfault, и, может быть, вы не поняли так много, но, работая задом наперед, я нахожу эти вещи подозрительными:
sprintf (str, "...",...); // 5-я строка от конца. ** отредактировано
В этот момент s указывает на маленький токен из strtok. Внутренности не будут ясны. Вы должны только sprintf() к тому, что вы знаете размер. Это, скорее всего, виновник.
Также возможно, что strtok не завершил ваши строки так, как вы ожидали; возможно, этого не произойдет, или, может быть, следующего жетона, которого вы ожидали, не было. Вы сами проверили свою методологию strtok(),sscanf()? memset()'может порекомендовать' 'использование всех ваших буферов s и s2 в'\0'.
Кроме того, хранить пароли в любом месте как строки опасно.