首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安全使用strcpy

安全使用strcpy
EN

Stack Overflow用户
提问于 2018-05-07 16:00:02
回答 4查看 5.6K关注 0票数 3

在我们公司的编码标准中禁止使用普通的旧strcpy,因为它有可能导致缓冲区溢出。我在寻找我们在代码中链接的第三方库的源代码。库源代码使用strcpy如下所示:

代码语言:javascript
复制
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的这种使用。感谢您的投入和专业知识。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-05-07 16:29:03

安全地使用strcpy是可能的--这只是相当困难的工作(这就是为什么您的编码标准禁止它)。

但是,您发布的代码并不是一个漏洞。没有办法用它覆盖内存;我不想重写它。(如果您确实决定重写它,请使用std::string代替。

票数 6
EN

Stack Overflow用户

发布于 2018-05-07 16:40:48

那么,该代码存在多个问题:

  • 如果分配抛出,就会有内存泄漏。
  • 使用strcpy()而不是重用长度是次优的。使用std::copy_n()memcpy()代替。

据推测,没有数据竞赛,也没有我们能知道的数据。

无论如何,性能的轻微下降是使用strcpy()的唯一“错误”。至少,如果您坚持手动管理您的字符串自己。

票数 3
EN

Stack Overflow用户

发布于 2018-07-06 11:34:45

偏离编码标准应该是可能的,但是要清楚地记录为什么要这样做。

strcpy的主要问题是它没有长度限制。在小心时,这是没有问题的,但这意味着strcpy总是伴随着一些保护代码。许多不太有经验的程序员都陷入了这一陷阱,因此编码准则开始付诸实施。

安全处理字符串复制的可能方法是:

  • 检查字符串长度
  • 使用像strlcpy这样的安全变体,或者在旧的微软编译器strncpy_s上使用。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50218217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档