я снова: 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
Я понятия не имею, почему!
Вы не указали, какая часть вашего кода вызывает segfault, и, может быть, вы этого не поняли, но, работая на фронт, я нахожу, что эти вещи подозреваются:
sprintf (str, "...",...); //5-я строка от конца. ** редактировал
В данный момент s указывает на небольшой токен от strtok. Внутренние элементы не будут ясными. Вы должны только sprintf(), чтобы вы знали размер. Это, скорее всего, преступник.
Также возможно, что strtok не nul-прекратил ваши строки в ожидании моды; возможно, это никогда не будет, или, может быть, следующий знак, которого вы ожидали, не существовал. Испытали ли вы свою собственную стратегию strtok(), sscanf()? memset(), вы можете рекомендовать все ваши буферы s и s2 до "\ 0".
Кроме того, хранение паролей в любом месте в виде строк опасно.
(theString == NULL)
никогда не будет правдой. И вы действительно должны проверить успех / неудачу ваших библиотечных вызовов (совершенных ровно один раз в этом коде) или рискнуть гневом богов (см. Заповедь № 6).