C++源代码审计问题整改记录

一、缓冲区溢出,使用不安全的函数

例如strcpy、sprintf、strcat、scanf等

应换用更安全的函数或者判断传入参数的大小,防止超过缓冲区大小。

strcpy()可改用strncpy(),并在最后添加0结尾符;sprintf()可改用snprintf();strcat()可改用strncat();scanf()可改用scanf_s()

 

二、处理问题时出错

  1. 未检查返回值的情况下调用函数
  2. 将负值用作了期望正值的函数的参数.

三、错误的表达式

  1.  可能除零
  2. .错误的sizeof()
    1. ​
      S2IDString tIDString;
      memset(&tIDString,0,sizeof(SIDString));
      ​

       

  3.  复制错误。
    Jint32 baseDirIndex = baseDirStr.find('/');
    	if(baseDirIndex!=-1)
    	{
    		baseDirStr = baseDirStr.mid(baseDirStr.find('/')+1);
    	}
    	else 
    	{
    		baseDirStr = QString::null;
    	}
    	Jint32 currentIndex  = currentDirStr.find('/');
    	if(currentIndex!=-1)
    	{
    		currentDirStr = currentDirStr.mid(currentDirStr.find('/')+1);
    	}
    	else 
    	{
    		baseDirStr = QString::null;
    	}
    1.  
  4. 条件是多余的,无论结果如何,执行的代码相同
    1.    if(pTermStruct == G_NULL)
          {
              return 1;
          }
          return 1 ;

四、控制流问题

无法到达的语句:不带符号的值判断>0,值永远为true

五、内存泄漏

  1. 非法访问

    strlen:将不以 null 终止的字符缓冲区传递给了期望获得以 null 终止的字符串的函数
    strncpy:大小应减1,并结尾加0

  1. 内存泄漏

    针对标量或使用 new[] 分配的指针数组使用了非数组删除

六、初始化

  1.  非void函数需要有返回值
  2. 变量使用前未初始化
  3. 标量字段未被构造函数初始化

    非静态类成员,在此构造函数或其调用的任何函数中未初始化

七、API使用错误

  1. 使用 va_start 或 va_copy 来开始处理;未使用 va_end 来结束
  2. 参数过多或过少,例如:未使用,但却传入了参数。
    1. sprintf(tmpBuf, "YVal", ProcTime.GetMonth()); 
      sql.Format("SELECT %s, %s FROM ",sHours[0]);

       

  3. 格式转换不兼容,例如%d,期望"int",但传入参数为"unsigned long";%s期望"char *",但传入"QString"
  4. 源缓冲区可能与目标缓冲区重叠,这会导致 "memcpy" 的未定义行为
    1.     memcpy(chPos, chPos+2, sizeof(char)*(strlen(i_pData->szBJName) - nPos-2));
          memset(chPos+strlen(chPos)-2, 0, sizeof(char)*2);

       

八、明文存储密码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值