【问题标题】:Unexpected results when trying to prevent stack overflow尝试防止堆栈溢出时出现意外结果
【发布时间】:2013-09-24 05:08:22
【问题描述】:

我正在尝试通过指定变量的宽度来保护下面的字段,以免发生缓冲区溢出。我宁愿不使用 fgets(),因为我正在尝试按照给定的规范编写一些东西(使用 scanf)。

代码如下:

char firstName[11], surName[21], job[16];

printf("Enter first name: ");
scanf("%10s", firstName);
printf("Enter surname: ");
scanf("%20s", surName);
printf("Enter job: ");
scanf("%15s", job);

所以对于这样的输入:

Enter first Name: UmbertoOverflow
/*surName gets skipped over*/
Enter job: janitor

我明白了:

First name: UmbertoOve
Surname: rflow
Job: janitor

它没有让我输入姓氏的机会,它只是用名字的其余部分填充。这对我来说似乎是缓冲区溢出,那么有没有办法使用 scanf 而不会得到这个结果?

【问题讨论】:

  • 缓冲区溢出和堆栈溢出是两个不同的东西。
  • 我的意思是基于堆栈的缓冲区溢出
  • 这也无关紧要。即使变量是静态的,您的代码也会有问题。

标签: c security input buffer-overflow


【解决方案1】:

%10s for first name 从输入字符串中仅读取前 10 个字符 - UmbertoOve 并放入 firstname。剩下的 - rflow - 仍然在程序的输入缓冲区中,scanf() for surname 会使用这些字符。输入名字时按下'\n' - 或Return - key 作为终止符并在surname 中添加rflow

不是缓冲区溢出,而是预期行为。

【讨论】:

  • 谢谢,如果不是缓冲区溢出那我就很高兴了。
【解决方案2】:

这不是缓冲区溢出。只是 scanf 以空格或换行符作为分隔符。因此,第一个 scanf 扫描 10 个字符,下一个继续扫描,直到找到一个空格或 '\n'。

使用

    scanf("%10s%*s", firstName);
    scanf("%20s%*s", surName);
    scanf("%15s%*s", job);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 2016-05-30
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多