scanf不安全原因和解决方案

这篇具有很好参考价值的文章主要介绍了scanf不安全原因和解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

方法一:

在头文件中加入#define _CRT_SECURE_NO_WARNINGS

通过项目 -> 属性 -> C/C++ -> 预处理器 -> 预处理器定义 -> 编辑,在框内写入 _CRT_SECURE_NO_WARNINGS

方法二:

在头文件上面加入一行命令:文章来源地址https://www.toymoban.com/news/detail-467509.html

#pragma warning(disable:4996)

前言:scanf,fopen,gets,strcpy,strcat等都是c语言的标准函数,但是这些函数都有缺陷是不安全的,由此微软建议为scanf_s,fopen_s等多传入一个参数,增强安全性,但是用起来更麻烦一些

浅分析原因

不安全的原因:可能会导致数组溢出或者缓冲区溢出,让黑客有可乘之机,从而发起“缓冲区溢出”攻击,如下程序:a最多只能存储 4 个字符(末位存储'\0'),不足以容纳用户输入的全部数据,所以多出来的 4 个字符就会使用a后面的内存,而a后面的内存可能没有使用权限,或者已经被别的数据占用,这种错误只能等到程序运行时才能检测出来,在编译期间根本无法检测;一旦检测出就是“程序崩溃”。因此scanf_s这样的函数可以防止hacker利用原版的不安全性(漏洞)黑掉系统。

#include<iostream>
#include<stack>
using namespace std;
#pragma warning(disable:4996)
//初略分析scanf和scanf_s
int main()
{
    char a[5];
    printf("%s\n", "scanf_s的输入:控制字符数量,小于5字符");
    scanf_s("%s", a,5);
    printf("%s%s\n\n","输出字符串:" ,a);

    printf("%s\n", "scanf_s的输入:控制字符数量,大于等于5字符");
    scanf_s("%s", a, 5);
    printf("%s%s\n\n", "输出字符串", a);

    printf("%s\n", "scanf的输入:控制字符数量,小于5字符");
    scanf("%s", a);
    printf("%s%s\n\n", "输出字符串:", a);

    printf("%s\n", "scanf的输入:控制字符数量,大于等于5字符");
    scanf("%s", a);
    printf("%s%s\n\n", "输出字符串", a);
    return 0;
}

scanf不安全原因和解决方案scanf不安全原因和解决方案

scanf不安全原因和解决方案

用scanf_s输入小于5的,正常,大于5的输入但赋值失败

scanf不安全原因和解决方案

 scanf不安全原因和解决方案

 用scanf输入小于5的成功,大于5,出现上述问题,因为a[5]不在字符串空间内,但它不考虑直接赋值,就产生了无法操控的空间被赋值a了,产生了漏洞,大致就是这样,其他的也如此。因此最好办法就是用scanf_s通过多加入参数保证其安全性。

处理方式

但如果接手一个大型的以前的项目,用到的全部是c语言标准函数或者新手就是想练习标准的函数(因为上手简单一些嘛),那怎么处理呢,下面介绍处理方式:

方法一:

通过项目 -> 属性 -> C/C++ -> 预处理器 -> 预处理器定义 -> 编辑,在框内写入 _CRT_SECURE_NO_WARNINGS方法二

方法二:

在头文件上面加入一行命令:

#pragma warning(disable:4996)

到了这里,关于scanf不安全原因和解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VsStudio中scanf返回值被忽略的原因及其解决方法

    相信有不少人在使用vs的时候会遇到以下这个问题:scanf返回值被忽略,接下来我就告诉大家该如何解决这个问题 出现问题的原因:   因为scanf()在读取数据时不检查边界,所以可能会造成内存泄漏。Microsoft公司觉得这个函数不安全,于是自己在VS编译器中提供了scanf_s()这个

    2024年01月18日
    浏览(28)
  • 解决VS中scanf()函数报错问题的四种方案(详细)

     scanf函数在VS中报错的主要原因是 scanf被认为不安全而被编译器默认设置为禁用。 那么如何解决这个问题呢 法一: 仅将函数 scanf 替换为 scanf_s 即可,其他语法不变。但scanf_s函数并不是C语言函数库里的标准函数,而是VS编译器所提供的函数,所以并不推荐用这种方法来解决

    2024年02月02日
    浏览(45)
  • SQL Sever2012安装错误——Windows Installer错误消息:打开安装日志文件的错误的原因及解决方案

    这个安装报错信息是我在安装SQL Sever2012时碰到的问题,百度了一下好像没有找到切实可行的方案,正好在此记录一下,也为更多的小伙伴提供便利 由于要对着错误信息来解决,所以此处是用手机拍摄的,如果看不清楚可以看下面的文字版;此处的错误是在 安装程序支持规则

    2024年02月06日
    浏览(59)
  • ThinkPHP文件上传:简便安全的解决方案

    在现代Web应用程序中,文件上传是一项常见而重要的功能。ThinkPHP是一种流行的PHP开发框架,提供了便捷而安全的文件上传解决方案。本文将介绍ThinkPHP框架中的文件上传功能,并探讨如何使用它来实现安全可靠的文件上传功能。 一、ThinkPHP文件上传的基本用法 ThinkPHP提供了丰

    2024年02月11日
    浏览(47)
  • Visual Studio编辑器中C4996 ‘scanf‘: This function or variable may be unsafe.问题解决方案

    目录 ​编辑 题目:简单的a+b 1.  题目描述 2.  输入格式 3.  输出格式 4.  样例输入 5.  样例输出 6.  解题思路 7.  代码示例 8.  报错解决 方案一 方案二 方案三 方案四 总结 输入两个整数a和b,计算a+b的和 本题很简单,但是注意此题是多组测试数据,即需要不停的接收系统

    2024年02月03日
    浏览(51)
  • Kafka数据丢失原因及解决方案

    Kafka包括Producer、Broker、Consumer,因此从这三个方面分析。 丢失原因:Kafka在Producer端的消息发送采用的是异步发送的方式(还有同步发送,但是同步发送会导致消息阻塞、需要等待),丢失数据是因为消息没有到达Broker端,原因可能是网络波动导致没有回调和数据消息太大超出

    2024年02月14日
    浏览(32)
  • 常见的内存泄漏原因和解决方案

    1.全局引用 问题:在JavaScript代码中,使用全局变量或全局对象来保存对DOM元素或其他对象的引用,这可能导致内存泄漏。 解决方案:避免使用全局变量或全局对象,改用合适的作用域来管理变量和对象的生命周期。确保在不再需要时正确地释放这些引用。 2.事件监听器 问题

    2024年02月13日
    浏览(45)
  • Handler内存泄漏原因及解决方案

    在Activity中,将Handler声明成非静态内部类或匿名内部类,这样Handle默认持有外部类Activity的引用。如果Activity在销毁时,Handler还有未执行完或者正在执行的Message,而Handler又持有Activity的引用,导致GC无法回收Activity,导致内存泄漏。如以下两种情形可能导致内存泄漏 1、在Act

    2024年02月16日
    浏览(58)
  • RabbitMq消息丢失原因及其解决方案

    我们首先了解下一条消息从生产到消费的整个流程如下: 生产--MQ Broker -- 消费。所以这三个环节都有丢失消息的可能。 1.1、生产者丢失消息 生产者将数据发送到rabbitmq的时候,可能因为网络问题导致数据就在半路给搞丢了。 1.使用事务(性能差) ​ RabbitMQ 客户端中与事务机

    2024年02月08日
    浏览(42)
  • SQLSyntaxErrorException异常产生原因及解决方案

    当我使用PreparedStatement 类进行数据库连接时,弹出错误 02 异常的产生原因 num=stmt.executeUpdate(sql);部分不需要再次传入sql executeUpdate:执行数据库的更新、插入和删除操作 ,返回改变记录的行数,但是使用PreparedStatement 类对传入数据进行加密时,在执行到这个语句的时候数据库

    2024年01月21日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包