安全编码1
memcpy/strcpy/system/random/printf等
为什么不安全?有的是溢出风险,但是如果小心地使用是不是就可以了呢?
printf
原文链接:https://blog.csdn.net/a369414641/article/details/47447193
打印的时候,printf按照字符转换说明符规定的格式从低地址开始提取数据,直到参数打印完。
比如遇到 %f 说明符就提取8个字节的数据,遇到 %d 就提取4个字节。printf()其实不知道参数的个数,它只会根据format中的打印格式的数目依次打印堆栈中参数format后面地址的内容。
这样一来,printf()其实存在安全隐患——没错,它会强行读取内存的数据当作正常数据输出,没有边界检测————很有可能产生堆溢出!
strcpy
原文链接:https://blog.csdn.net/kadwf123/article/details/7819052
函数原型为char *strcpy(char *dest,const char *src);
函数说明:strcpy函数会将参数src字符串拷贝至参数dest所指的地址。
参数说明:dest,我们说的出参,最终得到的字符串。src,入参,因为其有const修饰。表示在此函数中不会也不能修改src的值。
返回值:返回dest字符串的起始地址。
附加说明:如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。
特别强调:此函数很好用,可是它也很危险。如果在用的时候加上相关的长度判断,则会大大降低出此错误的危险。此函数还有一个特点,就是它在把字符串b拷贝到字符串a的时候,会在拷贝的a字符串的末尾加上一个\0结束标志。这个不同于strncpy()函数。
system
原文链接https://www.cnblogs.com/LiuYanYGZ/p/5838497.html
使用system()函数的建议 上在给出了调用system()函数的比较安全的用法,但使用system()函数还是容易出错,错在哪?
那就是system()函数的返回值,关于其返回值的介绍请见上篇文章。system()函数有时很方便,但不可滥用!
1、建议system()函数只用来执行shell命令,因为一般来讲,system()返回值不是0就说明出错了;
2、建议监控一下system()函数的执行完毕后的errno值,争取出错时给出更多有用信息;
3、建议考虑一下system()函数的替代函数popen();其用法在我的另一篇文章有介绍。
int my_system(const char * cmd) { FILE * fp; int res; char buf[1024]; if (cmd == NULL) { printf("my_system cmd is NULL!\n"); return -1; } if ((fp = popen(cmd, "r") ) == NULL) { perror("popen"); printf("popen error: %s/n", strerror(errno)); return -1; } else{ while(fgets(buf, sizeof(buf), fp)) { printf("%s", buf); } if ( (res = pclose(fp)) == -1) { printf("close popen file pointer fp error!\n"); return res; } else if (res == 0) { return res; } else { printf("popen res is :%d\n", res); return res; } } } |
memcpy
风险一:溢出
风险二:重叠
替代:memmove
random
替换:srand,rand
#include<stdlib.h>//头文件包含rand和srand函数 #include<stdio.h> #include<time.h>
void main() { int i,k; srand((unsigned)time(NULL));//选取种子文件 for(i=0;i<20;i++){ k=rand()%100;//%100控制随机数的范围 printf("k=%d\n",k);//输出随机数 } } |