zoukankan      html  css  js  c++  java
  • 安全编码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);//输出随机数

    }

    }

  • 相关阅读:
    原生js 异步请求,responseXML解析
    asp.net中Page.ClientScript.RegisterStartupScript用法小结
    asp.net 在repeater控件中加按钮
    无法打开物理文件 操作系统错误 5:拒绝访问 SQL Sever
    js 注册控件的onclick事件
    js控件设置只读属性和不可用属性
    js CheckBox只读
    js时间日期格式
    js正则判断日期
    UIPickerView的使用(三)
  • 原文地址:https://www.cnblogs.com/sunnypoem/p/11368507.html
Copyright © 2011-2022 走看看