scanf不安全原因及解决方法

不安全原因:

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

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #pragma warning(disable:6031)
 3 
 4 #include<stdio.h>
 5 
 6 int main(void)
 7 {
 8     char s[5];
 9     printf("请输入字符串(长度小于5):");
10     scanf_s("%s", s, 5);
11     printf("符串输出字符串:%s\n\n", s);
12 
13     printf("请输入字符串(长度大于等于5):");
14     scanf_s("%s", s, 5);
15     printf("符串输出字符串:%s\n\n", s);
16 
17     printf("请输入字符串(长度小于等于5):");
18     scanf("%s", s);
19     printf("符串输出字符串:%s\n\n", s);
20 
21     printf("请输入字符串(长度大于等于5):");
22     scanf("%s", s);
23     printf("符串输出字符串:%s\n\n", s);
24 
25     return 0;
26 }

解决方法:

方法一

使用sccanf_s来代替scanf函数。scanf_s是VS编译器提供的一种你函数,它能有效解决scanf函数不安全的问题。

缺点:

 (1)scanf_f函数的一些具体使用细节与scanf函数并不相同,我们需要单独学习scanf_s的使用方法。

(2)scanf_s不通用。scanf_s是VS编译器提供的,所以在其他平台上并不通用,这就导致了scaf_s编写出来的代码并不通用。

(3)除了scsnf函数,象gets,strcpy,strcat等函数在VS编译器中也会产生相同的问题。

方法二

在程序前面加上#define_CRT_SECURE_NO_WARNINGS 1

1 #define _CRT_SECURE_NO_WARNINGS 1

缺点:每次新建一个源.c文件都要在头部加上这个预处理命令,麻烦。

方法三

取消SDL检查。步骤:项目 -> 属性 -> C/C++ -> SDL检查 -> 否/SDL-

 缺点:每次新建一个源.c文件都要重复这个步骤,麻烦。

方法四

一劳永逸,点击下面链接

【C语言】一次性解决visual studio中scanf函数不安全报错问题_c语言scanf不安全_野猪佩奇`的博客-CSDN博客

 

posted @ 2023-03-23 15:00  平安喜乐123  阅读(1265)  评论(0编辑  收藏  举报