gpt4 book ai didi

c - 为什么 strlcpy 和 strlcat 被认为是不安全的?

转载 作者:太空狗 更新时间:2023-10-29 16:15:45 28 4
gpt4 key购买 nike

我知道 strlcpystrlcat 被设计为 strncpystrncat 的安全替代品。然而,有些人仍然认为他们是insecure, and simply cause a different type of problem .

有人可以举例说明如何使用 strlcpystrlcat(即 总是 null 终止其字符串的函数)如何导致安全有问题吗?

Ulrich Drepper 和 James Antill 声明这是真的,但从未提供示例或澄清这一点。

最佳答案

首先,strlcpy 从未打算作为 strncpy 的安全版本(并且 strncpy 从未打算作为 strcpy)。这两个功能完全无关。 strncpy 是一个与 C 字符串(即以 null 结尾的字符串)完全无关的函数。事实上,它的名称中有 str... 前缀只是一个历史错误。 strncpy 的历史和目的是众所周知的,并且有据可查。这是一个函数,用于处理在某些历史版本的 Unix 文件系统中使用的所谓“固定宽度”字符串(不是 C 字符串)。今天的一些程序员对其名称感到困惑,并假设 strncpy 在某种程度上应该用作有限长度的 C 字符串复制函数(strcpy 的“安全”兄弟),这实际上完全是胡说八道,会导致不良的编程习惯。当前形式的 C 标准库没有任何用于有限长度 C 字符串复制的功能。这就是 strlcpy 的用武之地。strlcpy 确实是为处理 C 字符串而创建的真正的有限长度复制函数。 strlcpy 正确地完成了有限长度复制函数应该做的所有事情。唯一可以针对它的批评是,很遗憾,它不是标准的。

其次,另一方面,strncat 确实是一个使用 C 字符串并执行有限长度连接的函数(它确实是 strcat< 的“安全”兄弟)/)。为了正确使用这个函数,程序员必须特别小心,因为这个函数接受的大小参数实际上并不是接收结果的缓冲区的大小,而是它剩余部分的大小(还有终止符被隐式计算)。这可能会造成混淆,因为为了将该大小与缓冲区的大小联系起来,程序员必须记住执行一些额外的计算,这通常用于批评 strncatstrlcat 负责处理这些问题,更改接口(interface)以便不需要额外的计算(至少在调用代码中)。同样,我看到有人可以批评这一点的唯一依据是功能不标准。此外,strcat 组中的函数在专业代码中不会经常看到,因为基于重新扫描的字符串连接的想法的可用性有限。

至于这些功能如何导致安全问题......他们根本不可能。它们不会比 C 语言本身“导致安全问题”更严重地导致安全问题。你看,很长一段时间以来,有一种强烈的情绪认为 C++ 语言必须朝着发展成某种奇怪的 Java 风格的方向发展。这种情绪有时也会蔓延到 C 语言领域,导致对 C 语言特性和 C 标准库特性的相当无知和被迫的批评。我怀疑在这种情况下我们也可能正在处理类似的事情,尽管我当然希望事情并没有那么糟糕。

关于c - 为什么 strlcpy 和 strlcat 被认为是不安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2114896/

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