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博客