【问题标题】:Prevent buffer overflow防止缓冲区溢出
【发布时间】:2018-10-26 23:45:46
【问题描述】:

我想通过使文件名长度不超过 20 个字符来防止缓冲区溢出。我应该使用更好的功能吗?喜欢 fgets?

#include <stdio.h>

int main()
{
char filename[20]; //20 character long
printf("Please enter your filename:");
scanf("%s", filename);


return 0;
}

【问题讨论】:

  • fgets() 允许限制输入的长度。试试fgets(filename, sizeof(filename), stdin)。这将防止缓冲区溢出。它还可以检测用户输入的字符何时超过缓冲区可以容纳的字符(而不是溢出缓冲区),以便您对其进行管理。阅读文档。
  • @Peter 我用fgets的时候不会读取文件,但是我用scanf没问题。
  • Specifying the maximum string length to scanf() dynamically in C (like %s in printf())。对于所示的情况,您可以使用具有静态长度限制的scanf("%19s", filename);(而不是链接问题中讨论的动态)
  • @myadeniboy 如果你使用fgets,你需要将remove the newline fgets 放入缓冲区。
  • 缓冲区太小并不能解决缓冲区溢出问题:)

标签: c buffer-overflow


【解决方案1】:

scanffgets 都可以使用,但是对于您的应用程序来说可能更容易。

scanf可以使用,但是要检查返回值。

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(void) {
    char filename[20];
    while(scanf("%19s", filename) == 1) {
        printf("filename: %s\n", filename);
    }
    if(errno) return perror("filename"), EXIT_FAILURE;
    return EXIT_SUCCESS;
}

输出,

12345678901234567890
filename: 1234567890123456789
filename: 0

fgets 获取整行而不将其与输入匹配。

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(void) {
    char filename[20];
    while(fgets(filename, sizeof filename, stdin)) {
        printf("filename: %s\n", filename);
    }
    if(errno) return perror("filename"), EXIT_FAILURE;
    return EXIT_SUCCESS;
}

输出,

12345678901234567890
filename: 1234567890123456789
filename: 0
[\n]

通常,过长的文件名会被截断或报错,这在fgets 中很容易看到,例如How to discard the rest of a line in C

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2014-01-12
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多