我们公司的编码标准禁止使用普通的 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[]作为源将其复制到该缓冲区中,而这应始终以空值结尾。
我很好奇,是否有人运行这段代码时,能够利用调试器来利用这个漏洞,或者如果有人试图攻击我们的二进制文件(使用此库源链接在其编译版本中),是否还有其他策略可以利用这种strcpy的用法。感谢您的意见和专业知识。
memcpy()
会更有效率,但无论如何,你最好使用std::string
。 - Slavastrncpy
通常都不是答案。它不能保证放置尾随的'\0'
,并且在复制小字符串时确保分配了过多的缓冲区。strcpy_s
或strlcpy
都是更好的选择(而且我真的很烦恼它们都不是强制性的)。(@nos: snap!) - Martin Bonner supports Monica