C/C++的注意事项

1 C/C++使用错误

不可以用没有长度限制的字符来拷贝函数

不可以用legacy的字符串拷贝、输入函数,这些函数的特征是:可以输出一长串字符串,而不限制长度。如果环境允许,应当使用其_s安全版本替代,或者使用n版本函数。

如果说使用形如sscanf之类的函数时,在处理字符串输入时应当通过%10s这样的方式来严格限制字符串长度,同时确保字符串末尾有\0。如果环境允许,应当使用_s安全版本。

因此,在使用n系列拷贝函数时,要确保正确计算缓冲区长度,同时,如果你不确定是否代码在各个编译器下都能确保末尾有0时,可以适当增加1字节输入缓冲区,并将其置为\0,以保证输出的字符串结尾一定有\0。

创建进程类的函数的安全规范

system、WinExec、CreateProcess、ShellExecute等启动进程类的函数,需要严格检查其参数。

另外,如果启动时从用户输入、环境变量读取组合命令行时,还需要注意是否可能存在命令注入。

比如,当用户输入1+1 && ls时,执行的实际上是calc 1+1和ls 两个命令,导致命令注入。

需要检查用户输入是否含有非法数据。

尽量减少使用 _alloca 和可变长度数组

_alloca 和可变长度数组使用的内存量在编译期间不可知。尤其是在循环中使用时,根据编译器的实现不同,可能会导致:(1)栈溢出,即拒绝服务; (2)缺少栈内存测试的编译器实现可能导致申请到非栈内存,并导致内存损坏。这在栈比较小的程序上,例如IoT设备固件上影响尤为大。对于 C++,可变长度数组也属于非标准扩展,在代码规范中禁止使用。

printf系列参数必须对应

所有printf系列函数,如sprintf,snprintf,vprintf等必须对应控制符号和参数。

防止泄露指针(包括%p)的值

所有printf系列函数,要防止格式化完的字符串泄露程序布局信息。例如,如果将带有%p的字符串泄露给程序,则可能会破坏ASLR的防护效果。使得攻击者更容易攻破程序。

%p的值只应当在程序内使用,而不应当输出到外部或被外部以某种方式获取。

不应当把用户可修改的字符串作为printf系列函数的“format”参数

如果用户可以控制字符串,则通过 %n %p 等内容,在的最坏情况下可以直接执行任意恶意代码。

在以下情况尤其需要注意: WIFI名,设备名

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_64144988

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值