gpt4 book ai didi

c - 使用 C 中的 getenv_s 处理 CONTENT_LENGTH

转载 作者:行者123 更新时间:2023-11-30 18:34:41 28 4
gpt4 key购买 nike

作为 C 新手,我刚刚遇到了 C11 添加 getenv_s。这就是我实际上想做的事情:

Handling POST data sent by html form in CGI C

在我的例子中,我正在尝试清理 CONTENT_LENGTH 和消息正文(stdin)。这就是我们的目标。

因此,为了限制上限(防止格式错误的 CONTENT_LENGTH,试图导致溢出),我尝试使用数组而不是指针,如下所示:

char some[512];
some = getenv("CONTENT_LENGTH");

它自然会抛出一个错误(从类型 char * 分配给类型 char[512] 时类型不兼容)。所以我假设,

Q1。 getenv 已经是一个字符串?

然后我遇到了“getenv_s”
http://en.cppreference.com/w/c/program/getenv

第二季度。谁能告诉我一种安全可靠的使用方法?避免下溢、上溢等情况

最佳答案

首先,不要使用任何 _s 函数。它们是 C11 的一个可选功能,据我所知,从未被任何人完全实现过,甚至连发明它们的微软也没有完全实现过,并且有人建议再次删除它们;更重要的是,他们实际上并没有解决他们声称要解决的问题。 (本意是为危险的字符串相关函数提供一堆直接替代品,但事实证明这行不通;修复 C 程序中与字符串相关的安全错误需要真正的重新设计并深思熟虑。真正无法安全使用的函数已经有了可移植的替代品,例如用 fgets 代替 gets,用 snprintf 代替 sprintf >, strsep 而不是 strtok —— 有时替换不在 ISO C 中,但它通常足够广泛,不用担心,或者您可以从 gnulib 获取填充程序实现。 )

getenv 保证返回一个有效的以 NUL 结尾的 C 字符串(或空指针),但该字符串可以是任意长的。在用 C 编写的 CGI 程序的上下文中,“清理”CONTENT_LENGTH 环境变量的值的正确方法是将其提供给 strtol 并仔细检查错误:

/* Returns a valid content_length, or -1 on error.  */
long get_content_length(void)
{
char *content_length, *endp;
long rv;

content_length = getenv("CONTENT_LENGTH");
if (!content_length) return -1;
errno = 0;
rv = strtol(content_length, &endp, 10);
if (endp == content_length || *endp || errno || rv <= 0)
return -1;
return rv;
}

strtol 调用后 if 语句中的四个子句中的每一个都会检查不同类别的格式错误的输入。你必须在调用之前显式清除errno,因为strtol报告溢出时返回的值也是没有溢出时可以返回的值,所以唯一的区分方法是查看 errno,但 errno 可能在某些早期操作中具有过时的非零值。

请注意,即使 CONTENT_LENGTH 在语法上有效,它也可能不值得信赖。也就是说,您可用的实际 POST 数据量可能少于或多于 CONTENT_LENGTH。请务必注意 read 返回的数字。 (这是一个示例,说明将字符串函数替换为“强化”函数并不能解决所有问题。)

关于c - 使用 C 中的 getenv_s 处理 CONTENT_LENGTH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50951013/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com