如何处理C中可能的bufferoverflow?

时间:2019-06-10 11:37:02

标签: c fgets buffer-overflow

我已经得到了一些代码,可能会导致缓冲区溢出,因此我应该对其进行更改,以使这种情况不再发生。

原始代码为:

#include <stdio.h>  // Include to use printf, scanf

int main()
{
    // Define buffers to store user name and password
    char username[16];
    char password[16];

    // Read username and password from user input
    printf("Enter your name: ");
    scanf("%s", username);
    printf("Enter your password: ");
    scanf("%s", password);
    printf("[SHOUTING OUT LOUD] Hello, %s!\n", username);

    return 0;
}

当然,您可以通过输入超过15个字符作为用户名来导致simplay溢出。要解决此问题,我将scanf替换为fgets

printf("Enter your name: ");
fgets(username, sizeof(username), stdin);
printf("Enter your password: ");
fgets(password, sizeof(password), stdin);
printf("[SHOUTING OUT LOUD] Hello, %s!\n", username);

不再存在溢出问题,但是当用户名输入超过15个字符时,由于其他字符仍然在stdin中,因此密码的输入只是“跳过”了。 我可以使用fflushwhile ((getchar()) != '\n');来解决此问题,但这仅在缓冲区“过度浮动”的情况下有效。如果输入的字符少于15个,程序将等待其他输入。

如何处理此问题,以防止溢出,但用户名和密码输入仍按预期工作?

0 个答案:

没有答案