CGI с использованием ошибки сегментации C

0

я снова: P, во всяком случае, я работал над программой на C, чтобы пользователи могли заходить на сайт, очень просто.

Однако мой код дает мне ошибку сегментации.

Информация передается через HTML POST на C, который затем сохраняется в файле.ssv как USERNAME PASSWORD

Когда я запускаю его с сайта, я получаю преждевременный конец заголовков скриптов, а при работе от 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;
}

Большое вам спасибо, если вы можете помочь, я застрял целыми днями.

EDIT: я исправил ошибку сегментации и преждевременный конец заголовков скриптов. ОДНАКО, когда я смотрю на свой файл members.ssv, я получаю что-то вроде

НАЧАЛО ФАЙЛА: пусто * пусто * @R

Я понятия не имею, почему!

  • 0
    Просто FYI (theString == NULL) никогда не будет правдой. И вы действительно должны проверить успех / неудачу ваших библиотечных вызовов (совершенных ровно один раз в этом коде) или рискнуть гневом богов (см. Заповедь № 6).
Теги:
cgi
login
segmentation-fault

1 ответ

1
Лучший ответ

Вы не указали, какая часть вашего кода вызывает segfault, и, может быть, вы этого не поняли, но, работая на фронт, я нахожу, что эти вещи подозреваются:

sprintf (str, "...",...); //5-я строка от конца. ** редактировал

В данный момент s указывает на небольшой токен от strtok. Внутренние элементы не будут ясными. Вы должны только sprintf(), чтобы вы знали размер. Это, скорее всего, преступник.

Также возможно, что strtok не nul-прекратил ваши строки в ожидании моды; возможно, это никогда не будет, или, может быть, следующий знак, которого вы ожидали, не существовал. Испытали ли вы свою собственную стратегию strtok(), sscanf()? memset(), вы можете рекомендовать все ваши буферы s и s2 до "\ 0".

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

  • 0
    Спасибо, я над этим поработаю, и я знаю, что это просто для задания класса, чтобы познакомить нас с CGI и HTML
  • 0
    Как бы я исправить спринтф? Поскольку значение в s должно быть USERNAME, а s2 - пароль no? Если нет, то это то, что мне нужно, чтобы они были
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню