gets vs fgets 程序溢出

gets vs fgets for overflow in program

我有以下c程序。当我输入字节字节时,由于缓冲区溢出,它给出了错误的输入。

这是程序


#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
  
int main(void) {
// Use a struct to force local variable memory ordering
struct {
char buff[5];
char perf;
} localinfo;
localinfo.perf = 0;

 
if(strcmp(localinfo.perf, "byte")){
printf ("\n Wrong Password \n");
}
else {
printf ("\n wrong Password\n");
localinfo.perf = 1; // Set a flag denoting correct password
}

//IF password matches
// GIVE root or admin rights to user
if(localinfo.pass){ 
  printf ("\n Congratulations! Root privileges given to the user!\n");
}

return 0;
}

正确的密码是byte,输入byte就可以了。 如果我由于缓冲区溢出而输入 bytebyte,则 pass 被修改为 1。并且用户正在获得管理员权限。

如果输入 bytebyte 作为输入输出是

密码错误

永远不要使用 gets 功能,它很危险且已过时。

改用fgets

fgets(localinfo.buff, sizeof(localinfo.buff), stdin);

为确保整行都被读取,请检查最后一个字符是否为 '\n'。如果不是,则假设出现问题并且输入了错误的密码。

试试这个

#include <stdio.h>

#include <string.h>

int main(void) {
  struct {
    char buff[10];
    char pass;
  }
  localinfo;
  localinfo.pass = 0;

  printf("\n Enter the password:\n");
  scanf("%[^\n]s", localinfo.buff);

  if (strcmp(localinfo.buff, "byte")) {
    printf("\n Wrong Password \n");
  } else {
    printf("\n Correct Password\n");
    localinfo.pass = 1;
  }
  if (localinfo.pass) {
    printf("\n Congratulations! Root privileges given to the user!\n");
  }

  return 0;
}