Обработка данных POST, отправленных с помощью HTML-формы в CGI C - PullRequest
0 голосов
/ 08 июня 2018

Итак, как я уже говорил несколько дней назад, я пытаюсь создать сценарий входа в систему с использованием CGI-C на сервере Apache.

Моя форма передает две переменные в Test.cgi: имя пользователя ипароль (только от 2 до 40 символов), используя метод POST.

вот мой код:

#include <stdio.h>
#include <stdlib.h>
int main(void) 
{
char *lengthy;
int figures;
char somelimit[512];
lengthy = getenv("CONTENT_LENGTH");
figures = atoi(lengthy);
fgets(somelimit, figures, stdin);
printf("Content-type: text/html\n\n");
printf("%s\n", somelimit);
return 0;
}

Q.Как извлечь значения имени пользователя и пароля из стандартного ввода?Обычное возвращение, которое я получаю в приведенном выше случае: «username = xyz & password = xyz12», как мне это обработать?

Q Я хочу ограничить то, что я читаю из заголовка CONTENT_LENGTH, в случае некорректного CONTENT-Длина заголовка.

какой тип данных возвращает этот заголовок?Я знаю, что он должен возвращать «десятичное число октетов».Допустимые значения: 0 или более.Я хочу взять от 1 до X, где X - верхний предел, учитывая, что у меня есть две переменные, имя пользователя / пароль, каждая из которых ограничена 40 символами в HTML-форме.

Я использовал int [] и char [] вместо указателя.Почему я не могу преобразовать его напрямую с помощью чего-то вроде:

int some[1024];
some = atoi(gentenv("CONTENT_LENGTH"));

почему atoi считается небезопасным?

Q.Как взять только стандартный ввод, содержащий только символы US-ASCII, чтобы избежать искаженного тела сообщения.

Я новичок в C, поэтому, пожалуйста, будьте спокойны :) PS: Пожалуйста, не рекомендуйте никаких фреймворков / веб-серверов и т. Д.

Редактировать: Я только что понял, что, возможно, я задал слишком много вопросов.Извини за это.Я собираюсь исправить этот пост, чтобы сделать его сплоченным и хорошо ограниченным.Подождите, пожалуйста.

Edit2: Это последний вопрос, больше никаких правок.Я приму ответ, который по крайней мере отвечает на 2 из 3 вопросов выше.

1 Ответ

0 голосов
/ 08 июня 2018

Здесь много чего происходит, и много вопросов.

Во-первых, я рекомендую вам не выводить свой HTTP-заголовок, пока вы не собираетесь выводить остальные.Это более логично и позволяет вместо этого выводить заголовок Redirect, если это требуется в вашей программе.

Во-вторых, используйте strtoul() вместо atoi(), поскольку в последнем нет проверки ошибок.

Вам нужен только один буфер, а не два;и я рекомендую вам выделять его динамически, исходя из длины контента.Используйте malloc() и не забудьте проверить возвращаемое значение.НЕ пытайтесь предвидеть верхние границы длины вашего контента.

Вам нужно будет декодировать строку аргумента, чтобы получить любые значения.То, что вы делаете с ними, зависит от вас, но обработка имен пользователей и паролей - совершенно отдельная тема, которая может занять несколько дней.Но достаточно сказать, что НИКОГДА не храните пароль в виде простого текста в файле.

CONTENT_LENGTH - это текст, переданный stdin.Этот текст включает в себя количество байтов содержимого.Вам придется преобразовать текст в целочисленный тип, вероятно, size_t, прежде чем он будет вам полезен.Это то, что делает ваша atoi() функция (которую, опять же, вы должны заменить на strtoul())

Использовать HTTPS.

Прекратите испускать заголовок Content-type преждевременно.Затем, если вы решите, что вам нужно перенаправить, вы можете вместо этого создать заголовок Redirect.

getenv() возвращает указатель на статический текстовый блок, который вы не можете изменить.Если вы скопируете указатель, вы не сможете изменить текст в строке.Если вы скопируете строку в новый массив, вы сможете изменить текст в строке;однако я не могу придумать причину, по которой вы хотели бы это сделать.

В вашем текущем коде вы не выделяете память из кучи, поэтому вам не нужно вызывать free().Тем не менее, я рекомендую вам переосмыслить этот аспект вашего дизайна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...