前言
目的:加强编程人员在编程过程中的安全以上,建立编程人员的攻击者思维,养成安全编码的习惯,写出安全、可靠的代码。
安全编码基本思想
1.程序在处理外部数据时必须经过严格的合法性校验,编程人员在处理外部数据过程中必须时刻保持这种思维意识,不能做出任何外部数据符合预期的假设,外部数据必须经过严格判断后才能使用。编码人员必须在这种严酷的攻击环境下通过遵守这一原则保证程序的执行过程符合预期结果。
2.尽量减少代码的攻击面,代码的实现严格尽量简单,避免与外部环境做多余的数据交互,过多的攻击面增加了被攻击的概率,尽量避免将程序内部的数据处理过程暴露到外部环境。
3.通过防御性的编码处理来弥补潜在编码人员的疏忽,粗心是人类的天性。由于外部环境的不确定性,以及编码人员的经验、习惯的差异,代码的执行过程很难达到符合预期设想的情况。因此在编码过程中必须采用防御性的策略,尽量缓解由于编码人员疏忽导致的缺陷。
- 变量声明应该赋予初值
- 谨慎使用全局变量
- 避免使用功能复杂、易用错的函数
- 禁用易用错的编译器/操作系统的机制
- 小心处理资源访问过程
- 不要改变操作系统的运行环境(创建临时文件、修改环境变量、创建进程等)
1.1 变量
规则1 :指针变量、表示资源描述符的变量、BOOL变量声明必须赋予初值
SOCKET s = INVALID_SOCKET;
unsigned char *msg = NULL;
BOOL success = FALSE;
int fd = -1;
规则2:指向资源句柄或描述符的变量,在资源释放后立即赋予新值
防止后续被重新引用
规则3:如果声明了类的成员变量,则必须在构造函数中赋予初值
规则4:严禁对指针变量进行sizeof操作
会导致实际的执行结果与预期不符
规则5:尽量使用const
在变量声明前加const关键字,表示变量不可被修改,这样就可以利用编译器进行类型检查,将代码的权限降到更低。
const float PI = 3.1415f
1.2 函数
规则1:数组作为函数参数时,必须同时将其长度作为函数的参数
通过函数参数传递数组或一块内存进行写操作时,函数参数必须同时彻底数组元素个数或所传递的内存块大小,否则函数在使用数组下标或访问内存偏移时,无法判断下标或偏移的合法范围,产生越界访问的漏洞。
int ParseMsg(BYTE *msg, size_t msgLen)
2、对于const char *类型的参数,它的长度是通过’\0’的位置计算出来,不需要传长度参数
int SearchName(const char *name)
3、如果参数是 char *,且参数作为写内存的缓冲区,那么必须传入其缓冲区长度
int SaveName(char *name, size_t len, const *inputName)
4、如果函数仅对字符串中的特定字符进行一对一替换,或者删除字符串中的特定字符,这时字符数组的访问不会超过原字符串边界,因此这类函数不需要传待修改的字符串长度。
5、对固定长度的数组,如果用数组的头地址作为子函数参数,由于性能原因,可以不用传递其长度。文章来源:https://www.toymoban.com/news/detail-702253.html
1.3 循环
规则1: 循环必须有退出条件,否则程序无法安全退出文章来源地址https://www.toymoban.com/news/detail-702253.html
到了这里,关于【C&C++编码规范】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!