【问题标题】:Handling POST data sent by html form in CGI C在 CGI C 中处理 html 表单发送的 POST 数据
【发布时间】:2026-02-17 12:50:01
【问题描述】:

所以,正如我几天前所说,我正在尝试在 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;
}

问。如何从标准输入中提取用户名和密码值?在上述情况下,我得到的正常回报是“username=xyz&password=xyz12”我该如何处理?

Q.我想限制从 CONTENT_LENGTH 标头读取的内容,以防 CONTENT-LENGTH 标头格式错误。

此标头返回什么类型的数据?我知道它应该返回“十进制数”。有效值为 0 或更多。我想取 1 到 X,其中 X 是上限,考虑到我有两个变量,用户名/密码,每个都限制为 40 个 html 形式的字符。

我尝试了 int[] 和 char[],而不是指针。为什么我不能直接用类似的东西转换它:

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

为什么 atoi 被认为是不安全的?

问。如何仅将标准输入仅包含 US-ASCII 字符,以避免格式错误的消息体。

我是 C 新手,所以请放轻松 :) PS:请不要推荐任何框架/网络服务器等。

编辑:我刚刚意识到也许我问了太多问题。对于那个很抱歉。我将修复这篇文章,使其具有凝聚力和界限。请待命。

Edit2:这是最后一个问题,不再编辑。我将接受至少回答上述 3 个问题中的 2 个的答案。

【问题讨论】:

    标签: html c arrays http cgi


    【解决方案1】:

    这里发生了很多事情,还有很多问题。

    首先,我建议您在即将输出其余部分之前不要输出 HTTP 标头。这样更合乎逻辑,并且允许您在程序中需要时输出Redirect 标头。

    其次,使用strtoul() 而不是atoi(),因为后者没有错误检查。

    您只需要一个缓冲区,而不是两个;我建议您根据内容长度动态分配它。使用malloc() 并且不要忘记检查返回值。不要试图预测内容长度的上限。

    您必须解码参数字符串以获取任何值。你对它们做什么取决于你,但处理用户名和密码是一个完全独立的话题,可能需要几天的时间。但我只想说,永远不要将密码以纯文本形式存储在文件中。

    CONTENT_LENGTHstdin 传递的文本。该文本包括内容的字节数。在对您有用之前,您必须将文本转换为整数类型,可能是size_t。这就是您的 atoi() 函数正在执行的操作(同样,您应该将其替换为 strtoul()

    使用 HTTPS。

    过早地停止发送Content-type 标头。然后,如果您决定需要重定向,则可以发出 Redirect 标头。

    getenv() 返回指向您无法更改的静态文本块的指针。如果复制指针,则无法更改字符串中的文本。如果将字符串复制到新数组中,则可以更改字符串中的文本;但是,我想不出您为什么要这样做的原因。

    在您当前的代码中,您不会在堆外分配任何内存,因此您无需调用free()。但是,我建议您重新考虑设计的这方面。

    【讨论】:

    • 您似乎不需要这里的帮助。
    • 请看一下。我很抱歉之前的范围。
    • 我之前已经回答了您提出的几乎所有问题。如果你不喜欢这个答案,没关系。但你的固执并不意味着我有义务帮助你。
    • 我的朋友,您的原始答案仍然缺少一些部分,因为您推荐了 strtoul,但没有说明如何以及为什么。再次,我很抱歉造成的麻烦。是的,您没有任何义务。如果您仍然可以出于善意提供帮助,那么欢迎您的帮助。不过还是谢谢你。
    • 我的答案并不缺乏。你的倡议是。去。看。它。向上。
    最近更新 更多