在我们公司的编码标准中禁止使用普通的旧strcpy,因为它有可能导致缓冲区溢出。我在寻找我们在代码中链接的第三方库的源代码。库源代码使用strcpy如下所示:
for (int i = 0; i < newArgc; i++)
{
newArgv[i] = new char[strlen(argv[i]) + 1];
strcpy(newArgv[i], argv[i]);
}由于strlen是在为要复制的缓冲区分配内存时使用的,这看起来很好。有没有可能有人可以利用这个正常的strcpy,或者这是安全的,因为我认为它看起来是?
我已经看到了使用strcpy导致缓冲区溢出的天真用法,但这似乎并非如此,因为它总是使用strlen为缓冲区分配适当的空间,然后使用argv[]作为源复制到该缓冲区,这个源应该始终为null终止。
老实说,我很好奇使用调试器运行这段代码的人是否可以利用这一点,或者是否有其他人试图破解我们的二进制文件(我们在编译后的版本中使用这个库源代码)来利用strcpy的这种使用。感谢您的投入和专业知识。
发布于 2018-05-07 16:29:03
安全地使用strcpy是可能的--这只是相当困难的工作(这就是为什么您的编码标准禁止它)。
但是,您发布的代码并不是一个漏洞。没有办法用它覆盖内存;我不想重写它。(如果您确实决定重写它,请使用std::string代替。
发布于 2018-05-07 16:40:48
那么,该代码存在多个问题:
strcpy()而不是重用长度是次优的。使用std::copy_n()或memcpy()代替。据推测,没有数据竞赛,也没有我们能知道的数据。
无论如何,性能的轻微下降是使用strcpy()的唯一“错误”。至少,如果您坚持手动管理您的字符串自己。
发布于 2018-07-06 11:34:45
偏离编码标准应该是可能的,但是要清楚地记录为什么要这样做。
strcpy的主要问题是它没有长度限制。在小心时,这是没有问题的,但这意味着strcpy总是伴随着一些保护代码。许多不太有经验的程序员都陷入了这一陷阱,因此编码准则开始付诸实施。
安全处理字符串复制的可能方法是:
https://stackoverflow.com/questions/50218217
复制相似问题