【发布时间】:2021-01-29 18:16:52
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
char first_name[20];
char last_name[20];
int student_num;
char debts[1];
printf("Enter name:");
scanf("%s", first_name);
printf("Enter lastname:");
scanf("%s", last_name);
printf("Enter six bits length student ID:");
scanf("%d", &student_num);
printf("Do you have debts for university [Y/N]?");
scanf("%s", debts);
printf("\nYour name is %s %s.\n", first_name, last_name);
printf("Your Student ID is %d.\n", student_num);
printf("Debts: %s.\n", debts);
return (EXIT_SUCCESS);
}
如何避免这段代码中的缓冲区溢出?我希望我的代码产生这样的输出:
Enter name:Enescekilokoneyasharrontannamyantoniaaquin
Enter lastname:Basenau
Enter six bits length student ID:456789
Do you have debts for university [Y/N]?YES
Your name is **Enescekilokoneyashar** (only 20 bits from name input) *Basenau*.
Your Student ID is **393299**.
Debts: **Y**.
Process returned -1073741819 (0xC0000005) execution time : 36.336 s
Press any key to continue.
我试过用:
scanf("%19s", first_name);
但它并没有像我预期的那样工作。我需要找到另一种方法来验证输入参数,以防止缓冲区溢出攻击并将输入限制为缓冲区大小。
【问题讨论】:
-
scanf()是一个用于解析输入的可怕函数,正如您所发现的那样。当它无法转换输入时,它会使您的输入流处于未知状态,如果它是像stdin这样您无法返回的流,这真的很糟糕。更反常的是,如果您使用带有[f]printf()的格式字符串编写一组字段,则不能保证相同的格式字符串在scanf()使用时能够读取相同的数据。通常最好通过fgets()(或getline(),如果可用)读取整行并自己解析字符串。您甚至可以使用sscanf()复制scanf()。 -
(cont) 这也比
scanf()的“我是否将换行符留在缓冲区中?!?”更好地处理换行符。scanf()与其他输入读取函数混合时的不确定性。
标签: c buffer-overflow