我想在以下程序中避免缓冲区溢出漏洞,
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);
}
答案 0 :(得分:1)
fgets(str2, 8, STDIN);
fgets有三个参数:
STR
NUM
流
请参阅here。
答案 1 :(得分:1)
我应该指出的第一件事是你的第一个实现有缓冲区溢出的原因。
// 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);
所以我们需要的是一种告诉'获取'的方法,以获得不超过8个字符。 fgets帮助我们解决这个问题。它需要一个参数,即要读取的最大字符数。有关fgets的详细信息,请查看弗拉基米尔的帖子。