исправление переполнения буфера пожалуйста - PullRequest
0 голосов
/ 17 декабря 2010

Я хочу избежать уязвимости переполнения буфера в следующей программе,

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); 
} 

Ответы [ 2 ]

1 голос
/ 17 декабря 2010

Первое, на что я должен указать, почему ваша первая реализация имеет переполнение буфера.

// 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);  

Итак, нам нужен способ сказать 'get', чтобы получить не более чем8 символов.fgets помогает нам решить эту проблему.Требуется параметр, максимальное количество символов для чтения.Посмотрите на пост Владимира для более подробной информации о fgets .

1 голос
/ 17 декабря 2010
  fgets(str2, 8, STDIN);    

fgets принимает три аргумента:

str

  • Указатель на массив символов, в котором хранится прочитанная строка.

num

  • Максимальное количество символов для чтения (включая последний нулевой символ).Обычно используется длина массива, переданного как str.

stream

  • Указатель на объект FILE, который идентифицирует поток, из которого считываются символы.Для чтения из стандартного ввода для этого параметра можно использовать стандартное вводное окно.

см. здесь .

...