首页 > 其他分享 >gets 不安全,请使用 fgets

gets 不安全,请使用 fgets

时间:2024-04-14 15:23:20浏览次数:16  
标签:name char 安全 printf fgets input gets

结论: 为了安全考虑,用 fgets(b,sizeof(b),stdin) 替代 gets(b)

下面是 gets.c 的代码

#include <stdio.h>
int main() {
    char b[40];
    gets(b);
    printf("%s", b);
    return 0;
}

使用 gcc 10.2.1 进行编译(gcc gets.c -o gets)会提示 warning: implicit declaration of function 'gets' is invalid in C99 [-Wimplicit-function-declaration]warning: the gets' function is dangerous and should not be used.`,当然只是警告,程序还是可以正常运行的。

强烈建议使用 fgets 替代 gets,使用案例如下:

#include <stdio.h>
int main() {
    char b[40];
    fgets(b,sizeof(b),stdin);
    printf("%s", b);
    return 0;
}

异常情况演示

#include <stdio.h>

int main() {
    char a;
    char name[3];
    char b;
    printf("input char a:");
    a = getchar();
    printf("value of char a:%c\n", a); //第一次输出a的值
    // 清除输入缓冲区中的换行符,不然就可能把回车赋值给name了
    while (getchar() != '\n') {
        // 空循环体,只是为了消耗输入缓冲区中的字符
    }
    printf("input chars name:");
    gets(name);
    printf("value of chars name:%s\n", name);
    printf("input char b:");
    b = getchar();
    //输出所有的值,注意a的值不对劲了
    printf("a:%c; name:%s; b:%c \n", a, name, b);
}

运行结果如下:

input char a:a
value of char a:a
input chars name:1234567890
value of chars name:1234567890
input char b:b
a:4; name:1234567890; b:b 

可以看到变量 a 的值刚开始输出是对的,但是最后再次输出时,就变化了,然而代码没有修改 a。原因是输入 name 是用 gets,同时输入长度超出了限制,代码编译后不管这个情况,照样把这个值往内存里填,从而影响了其它变量的值

下面是用 fgets 的例子,同时在输入 b 之前也进行了清空输入缓冲区域,可以注意到这回超出长度限制的 name 输入没有影响其它变量的值

#include <stdio.h>

int main() {
    char a;
    char name[3];
    char b;
    printf("input char a:");
    a = getchar();
    printf("value of char a:%c\n", a);
    while (getchar() != '\n') {
    }
    printf("input chars name:");
    fgets(name, sizeof(name), stdin); // 使用 fgets 代替 gets
    printf("value of chars name:%s\n", name);
    while (getchar() != '\n') {
    }
    printf("input char b:");
    b = getchar();
    // 输出所有的值,注意a的值没有发生变化
    printf("a:%c; name:%s; b:%c \n", a, name, b);
}

Refer

关于gets()的危险(不安全)性 C 2018/04/08

https://github.com/BackMountainDevil/c_qa

标签:name,char,安全,printf,fgets,input,gets
From: https://www.cnblogs.com/guilinmifen/p/18134182

相关文章

  • 11、操作系统安全加固-Windows 加固
    1.账号管理与认证授权1.1.按用户类型分配账号目的:根据系统要求,设定不同账户和组,管理员、数据库sa、审计用户、来宾用户等实施方法:打开本地用户和计算机管理器或 打开运行,输入lusrmgr.msc右击账户->属性->更改隶属于右击功能组->属性->成员1.2.清理......
  • 10、操作系统安全加固-Linux加固
    1.账号管理与认证授权1.1.为不同的管理员分配不同的账号目的:根据不同用途设置不同账户账号,提高安全层级实施方法:1.设置高风险文件为最小权限,如:passwd、shadow、group、securetty、services、grub.conf等2.使用sudo命令设置命令执行权限和禁止敏感操作权限3.检查其他权限过......
  • 再次理解Android targetSdkVersion
    1.问题发生第一问题发生:两个APP访问同一个系统类android.net.IpConfiguration,均正常编译生成apk安装到同一台设备上(排除了外部因素)。一个app能正常访问IpConfiguration的属性IpAssignmentipAssignment,另一个却报错没有这个属性。出问题的那个app,我通过反射获取获取并打印了Ip......
  • FIT1047计算机系统、网络和安全
    FIT1047计算机系统、网络和安全-S12024课业2——流程和MARIE编程目的过程和程序使计算机做我们希望它们做的事情。在本课业的第一部分,学生将调查运行的过程在他们的电脑上。第二部分是关于MARIE汇编中的编程语言这将使学生能够展示他们对处理器工作的基本方式。本课业涉及单元学......
  • 在Linux中,如何进行系统安全加固?
    在Linux中,进行系统安全加固是确保系统抵御外部攻击和内部威胁的重要措施。以下是一些关键的安全加固步骤:1.保持系统更新定期更新系统和所有软件包,以确保安装了最新的安全补丁和功能。sudoaptupdate&&sudoaptupgrade#Debian/Ubuntusudoyumupdate......
  • 深入理解MD5算法:原理、应用与安全
    第一章:引言导言在当今数字化时代,数据安全和完整性变得至关重要。消息摘要算法是一种用于验证数据完整性和安全性的重要工具。在众多消息摘要算法中,MD5(MessageDigestAlgorithm5)因其快速、广泛应用和相对较高的安全性而备受关注。本书将深入探讨MD5算法的原理、应用和安全性,帮......
  • 智慧矿山视频智能监控与安全监管方案
    一、行业背景随着全球能源需求的日益增长,矿业行业作为国民经济的重要支柱,其发展日益受到广泛关注。然而,传统矿山管理模式的局限性逐渐显现,如生产安全、人员监管、风险预警等方面的问题日益突出。因此,智慧矿山智能监管方案的提出,旨在通过集成先进的信息技术,实时监测矿山生产过程中......
  • 域控软件安全隔离关键技术剖析:MCU域 VS SOC域
    安全隔离的需求    功能安全开发中,软件阶段由软件V模型左边的软件安全需求SSR开始。SSR是从技术安全需求TSR中提取出软件的功能安全需求,大多数情况下具有不同的ASIL等级。图1 功能安全软件开发V模型    随后,软件安全需求会被分配到软件架构中的软件组件中。......
  • 软件开发文档模板全套合集(开发+实施+运维+安全+交付)
    前言:在软件项目管理中,每个阶段都有其特定的目标和活动,确保项目的顺利进行和最终的成功交付。以下是软件项目管理各个阶段的详细资料:软件项目全套文档资料下载:点我获取1.需求阶段目标:收集、分析和定义用户需求和业务目标。主要活动:需求调研:与用户沟通,了解他们的需求和期......
  • 企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管
     工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理   工程项目各模块及其功能点清单一、系统管理    1、数据字典:实现对数据字典标签的增删改查操......