下面的系列文章主要围绕《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》进行讲解,该标准是2020年4月28日,由国家市场监督管理总局、国家标准化管理委员会发布,2020年11月01日开始实施。我们对该标准中一些常见的漏洞进行了梳理,大家感兴趣的话可以自己去下载下来学习一下,里面有一些最佳实践是比较好的。
本标准从程序安全和环境安全两个方面提出了提升应用安全性的编程最佳实践。其中,程序安全部分描述软件在资源使用、代码实现、安全功能方面的安全性规范,环境安全部分描述软件的安全管理配置规范。前面的文章为大家讲解了程序安全,本文我们针对代码安全的最后几部分函数调用安全、异常处理安全和指针安全进行解读。
【函数调用安全】
这部分都是规范性的问题,我们在开发之初就需要定义好,不要因为这些问题而产生一些安全漏洞。
1.确保函数能正确并安全的处理传入参数的数量、顺序、类型、值不满足预期的情况。
2.谨慎处理来自不可信数据源的格式化字符串,避免直接用于构造命令。
举一个例子,大家在写C、 C++语言的时候,输出格式会输出一些格式化的字符串,格式化的要求那块,不要来自不可信数据源,如果来自不可信数据源要进行验证,不要直接构造。
【异常处理安全】
1. 自行处理程序错误,并且不依赖于服务器配置。
2.避免在静态对象的构造器和线程存储周期内抛出异常。
3.异常处理时及时回收并释放系统资源
4.不在软件执行异常时暴露敏感信息:
(1)向用户展示通用的错误提示信息。
(2)在系统发生异常时禁止向用户暴露敏感信息包含但不限于:系统的详细信息、会话标志符、账号信息、调试或堆栈跟踪信息。
我们在做系统设计的时候,系统中的错误页面最好是做成统一的,出现问题后统一跳转我们提前做好的页面,不要直接暴露错误,像e.printStackTrace这种都是不允许的,因为这里面都有敏感信息。
例如直接报500错误,500错误中可能会直接出来一堆代码,包括数据库访问的一些语句都会出来,所以说这样是不安全的,这个也是要在设计之初就要做好考虑。
【指针安全】
这部分主要是针对C、C++语言,像一空指针之类的,我们就不详细展开说了。
1.在使用指针的过程中,确保指针的有效性。
2.确保指针类型的正确使用:
(1)明确指针类型的兼容性。
(2)不将非结构体类型指针强制转换为指向结构类型。
3.确保正确地使用指针运算:
(1)不要在非数组对象的指针上执行指针运算。
(2)避免使用指针的加减法来确定内存大小。
后面的文章会继续对《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》的其他部分进行解读,欢迎继续关注。
(本系列文章根据《优品软件培育计划》公益直播内容整理,可以私信我获取直播回放链接。)