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'.

Кроме того, хранить пароли в любом месте как строки опасно.

Другие вопросы по тегам