-1

我想避免以下程序中的缓冲区溢出漏洞,

int main (int argc, char *argv[ ]) {    
  int valid=FALSE;     
  char str1[8];     
  char str2[8];      
  next_tag(str1);     
  gets(str2);    
  if (strncmp(str1,str2,8)==0)      
    valid=TRUE;     
  printf("buffer: str1(%s),str2(%s),valid(%d) \n", str1, str2, valid); 
} 

为了修复漏洞,这是对它的正确更正吗?

int main (int argc, char *argv[ ]) {     
  int valid=FALSE;     
  char str1[8];     
  char str2[8];      
  next_tag(str1);     
  fgets(str2);       /* HERE IS THE CHANGE! */
  if (strncmp(str1,str2,8)==0)        
    valid=TRUE;     
  printf("buffer: str1(%s),str2(%s),valid(%d) \n", str1, str2, valid); 
} 
4

2 回答 2

2
  fgets(str2, 8, STDIN);    

fgets 接受三个参数:

字符串

  • 指向存储读取的字符串的字符数组的指针。

  • 要读取的最大字符数(包括最后的空字符)。通常,使用作为 str 传递的数组的长度。

溪流

  • 指向 FILE 对象的指针,该对象标识从中读取字符的流。要从标准输入读取,stdin 可用于此参数。

这里

于 2010-12-17T15:23:09.607 回答
2

我应该指出的第一件事是为什么您的第一个实现有缓冲区溢出。

// Allocate a char array that can hold 'max' 8 characters.
char str2[8];

// Ask user for input and stuff it into str2. If the user
// gives us more than 8 characters, we will end up overwriting
// str2 beyond its allocated buffer. 
gets(str2);  

所以我们需要的是一种告诉'gets'的方法,得到不超过8个字符。fgets 帮助我们解决这个问题。它需要一个参数,即要读取的最大字符数。有关fgets的更多详细信息,请查看 Vladimir 的帖子。

于 2010-12-17T15:38:56.007 回答