安全编码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字符串的末尾加上一个结束标志。这个不同于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! ");

        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! "); return res;

        } else if (res == 0) {

            return res;

        } else {

            printf("popen res is :%d ", res); return res;

        }

    }

}

memcpy

风险一:溢出

风险二:重叠

替代:memmove

 

random

替换:srand,rand

#include<stdlib.h>//头文件包含randsrand函数

#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 ",k);//输出随机数

}

}

原文地址:https://www.cnblogs.com/sunnypoem/p/11368507.html