因此,正如我几天前所说,我正试图在Apache服务器上使用CGI-C创建登录脚本。
我的表单是使用POST方法向Test.cgi提交两个变量:用户名和密码(仅限2到40个字符)。
到目前为止,这是我的代码:
#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值。如何从标准输入中提取用户名和密码值?我在上述情况下得到的正常回报是&#34; username = xyz&amp; password = xyz12&#34;我该如何处理?
问:我想限制从CONTENT_LENGTH标头读取的内容,以防出错的CONTENT-LENGTH标头。
此标头返回的是哪种类型的数据?我知道它应该返回一个&#34;十进制八分之一&#34;。有效值为0或更多。我想取1到X,其中X是上限,考虑到我有两个变量,用户名/密码,每个都以html形式限制为40个字符。
我尝试了int []和char [],而不是指针。为什么我不能直接使用以下内容进行转换:
int some[1024];
some = atoi(gentenv("CONTENT_LENGTH"));
为什么atoi被认为不安全?
Q值。如何仅将stdin仅包含US-ASCII字符,以避免格式错误的消息体。
我是新手,所以请放轻松:) PS:请不要推荐任何框架/网络服务器等。
编辑:我刚才意识到也许我问了太多问题。对于那个很抱歉。我将修复这篇文章,使其具有凝聚力和良好的界限。请等待。
Edit2:这是最后一个问题,不再需要修改。我会接受一个答案,至少回答上述3个问题中的2个问题。
答案 0 :(得分:1)
这里发生了很多事情,还有很多问题。
首先,我建议您不要输出HTTP标头,直到您要输出其余的标头。这种方式更符合逻辑,并允许您输出Redirect
标头,而不是程序中的某些内容需要它。
其次,使用strtoul()
代替atoi()
,因为后者没有错误检查。
你只需要一个缓冲区,而不是两个;我建议你根据内容长度动态分配它。使用malloc()
并且不要忘记检查返回值。不要试图预测内容长度的上限。
您必须解码参数字符串以获取任何值。您使用它们取决于您自己,但处理用户名和密码是一个完全独立的主题,可能需要数天才能完成。但足以说明,永远不要在文件中以纯文本形式存储密码。
CONTENT_LENGTH
是stdin
传递的文字。该文本包括内容的字节数。在对您有用之前,您必须将文本转换为整数类型,可能是size_t
。那就是你的atoi()
函数正在做的事情(再次,你应该用strtoul()
代替)
使用HTTPS。
提前停止发出Content-type
标题。然后,如果您决定需要重定向,则可以发出Redirect
标题。
getenv()
返回指向您无法更改的静态文本块的指针。如果复制指针,则无法更改字符串中的文本。如果将字符串复制到新数组,则可以更改字符串中的文本;但是,我想不出你为什么要这样做的原因。
在当前代码中,您不会从堆中分配任何内存,因此您无需调用free()
。但是,我建议您重新考虑设计的这一方面。