为什么“strcat”被认为是“不安全”?

时间:2011-04-26 16:50:52

标签: c++ visual-c++ strcat

  

可能重复:
  Why does MSVC++ consider “std::strcat” to be “unsafe”? (C++)

这是我的代码:

char sentence[ 100 ] = "";
char *article[ 5 ] = { "the", "a", "one", "some", "any" };

lexeme = rand() % 4; // random lexeme
strcat( sentence, article[ lexeme ] );
strcat( sentence, " " );

在MSVC ++中调试时,它给了我这些警告信息:

Warning 1   warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead.
Warning 2   warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. 

我该如何解决?

3 个答案:

答案 0 :(得分:14)

这是因为没有什么可以阻止你从strcat - 超过100个字节进入你的sentence缓冲区,未定义的结果包括堆损坏,堆栈损坏,程序退出,甚至某人如果正确构造了超过第100个字节的数据,则拥有您的机器。这是一类常见的安全漏洞,称为buffer overflow

要避免这种情况,请使用std::string的{​​{1}},毕竟这是C ++。 CRT不再需要限制你了。

答案 1 :(得分:1)

因为这是合法的

char sentence[ 1] = "";
char *article[ 5 ] = { "the", "a", "one", "some", "any" };

lexeme = rand() % 4; // random lexeme
strcat( sentence, article[ lexeme ] ); // BUFFER OVERRUN
strcat( sentence, " " );

这将允许您通过句子数组修改堆栈上的任何内容。你可能会在没有语言或操作系统阻止你的情况下通过覆盖其他堆栈变量而在不知不觉中导致错误。此外,存在巨大的安全问题 - 堆栈上的内容包括返回函数的指针返回。一个聪明的攻击者可以在你的数据中插入一个指针代码,允许他们执行他们想要的任何东西。

我建议尽可能避免使用C样式字符串。尽可能使用std :: string,当你绝对必须使用C字符串时,使用Microsoft reccomended security enhancements到C std lib。

答案 2 :(得分:0)

您可以使用strcat_s来修复潜在的缓冲区重载。