第五章安全编码5.1什么是软件编码5.2编码方法5.3代码审核第五章安全编码25.1什么是软件编码正确理解软件编码(1)什么是软件编码?(2)程序员应具备的能力(3)软件编码过程第五章安全编码35.1.1什么是软件编码(1/2)第五章安全编码45.1.1什么是软件编码(2/2)理解软件编码–复杂地讲,软件编码是一个系统工程,是一个复杂而动态的过程,包括程序设计和程序实现,即如何正确的理解用户需求和软件设计的思想;如何正确的根据软件设计进行程序设计;如何正确而高效的进行代码编写和测试。–软件编码是设计的继续,会影响软件质量和可维护性。程序员就是软件工程师,兼顾设计和编码。–国内对好程序员的要求是比较高的,不光要掌握一门编程语言,熟悉软件编码;还要全方位地了解软件设计,这样才能成为一个合格的程序员,真正的软件从业人员。–第五章安全编码55.1.2程序员应具备的能力(1/3)必备能力–英语阅读功底–数学功底(算法)–做事的条理性–认识事务的能力(抽象、模型、结构、层次)–计算机软、硬件基础知识–SQL编程–拿来主义和拿来的能力基本功:基本原理和实践,欲速则不达。第五章安全编码65.1.2程序员应具备的能力(2/3)热情和勇气–热情乐天,摈弃绝望,软件行业千变万化,技术日新月异–随时有面对无知的勇气–随时有承认错误的勇气–随时准备加班精通一门编程语言–了解一点主流桌面应用程序程序开发语言–了解一点主流网络应用程序开发技术–了解一点主流关系型数据库管理系统–不同的程序设计语言只代表其编程元素和规则不同,但基本的编程、方法都是相通的,掌握了一门即可掌握其它。第五章安全编码75.1.2程序员应具备的能力(3/3)如何使自己迅速成为一个程序员——抓住一切机会,勇于实践–克服恐惧心理,敢于写程序,尽快写程序–从最简单的程序写起–如果有工程机会,无偿也值–不要避重就轻–知难而上第五章安全编码85.1.3软件编码过程第五章安全编码95.2编码方法5.2.1编码规范5.2.2若干建议第五章安全编码105.2.1编码规范编码规范的必要性:有助于程序的维护,降低软件生命周期成本,符合项目管理的规律;使团队中相关人员的流动对项目的影响尽可能小,有利于项目的控制与管理;提高程序的可读性,有利于相关设计人员交流,提高软件质量;容易发现代码的问题,调试时比较容易;体现公司形象。第五章安全编码115.2.1编码规范(1)文件命名与组织(2)缩进、空格与换行(3)命名规则(4)声明(5)语句(6)注释第五章安全编码12命名方法Pascal:每个单词首字母大写。Camel:第一个单词首字母小写,余下的单词首字母大写。缩写:两个字母的缩写,Pascal命名法两个字母都大写,Camel命名法,如果两个缩写字母是首单词,两个字母都小写,否则按照常规来处理。两个以上字母的缩写都按照常规处理。第五章安全编码13文件命名与组织文件的命名一般采用Pascal命名规则,无特殊情况,文件的扩展名小写。文件的扩展名使用统一而且通用的扩展名,如.cs、.java、.cpp尽量避免超过2000行的文件,尽量避免一行的长度超过80个字符。第五章安全编码14缩进、空格与换行空格、空行不做严格的固定,以使代码清晰为基本原则。空行不影响程序的运行,但可以使代码看起来清晰,增加可读性,因此可以适当的多用。代码的缩进建议使用tab键进行控制,tab键的大小设置为4个空格。每个层次都要进行缩进。如:if(isOverFlow){returnfalse;}第五章安全编码15缩进、空格与换行换行,掌握的原则是不要使一行代码特别的长。另外,换行的原则是,在逗号后,操作符前换行,换行与首行要保持缩进。if,while,do,try-catch-finally等语句后必须有{},即使里面只有一条语句或为空。第五章安全编码16缩进、空格与换行第五章安全编码17缩进、空格与换行第五章安全编码18Exercise第五章安全编码19Exercise第五章安全编码20命名规则–标识符的名字应当直观且可以拼读,可望文知义,不必进行“解码”。例如:CurrentValue与NowValue。–变量的名字应当使用“名词”或“形容词+名词”的格式命名。例如:floatvalue;floatoldValue;–全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就对象本身。例如:DrawBox();//全局函数box.Draw();//类的成员函数–静态变量加前缀s_(表示static)例如:staticints_initValue;–如果不得已使用全局变量,全局变量加前缀g_(表示global)例如:intg_howManyPeople;–类的成员变量加m(表示member),从而避免数据成员与成员函数的参数重名。例如:voidObject::SetValue(intwidth,intheight){m_width=width;m_height=height;}第五章安全编码23声明每行只定义一个声明,多个声明要分多行来定义。如:intintAge,intWeight;//不推荐应使用如下的定义形式:intintAge;intintWeight;声明的位置:变量要在块的开始的地方集中进行声明,不要何时用到何时临时定义。第五章安全编码24语句一行一条语句第五章安全编码25注释要养成良好的代码注释习惯,通常,注释要占实际代码总行数的1/3,同时,要在编写代码前或编写代码的同时进行代码的注释,不要事后补写注释。注释分为多行注释和单行注释,我们的原则是:在类和方法的前面,要写多行注释,在定义类的全局变量/常量,以及方法的内部,使用单行注释。注释的前面与代码之间要有空行即使是单行注释,我们鼓励都要单独一行,不鼓励在语句的后面使用注释,当然,在变量定义的后面使用注释也是允许的,但不建议这么做。另外,在编写注释的时候,建议使用编程语言自己的注释风格。第五章安全编码26注释特别注意,如果是在已经发行版本的基础上添加、修改、删除代码,则需要将原先的代码注释掉,而不是直接删除掉,然后添加自己的代码。如:添加新代码的注释://addby[姓名]yyyyMMddxxx//addby[姓名]yyyyMMdd修改代码的注释://updateby[姓名]yyyyMMdd//xxxyyy//updateby[姓名]yyyyMMdd删除代码的注释://deleteby[姓名]yyyyMMdd//xxx//deleteby[姓名]yyyyMMdd/**************************************************************命名空间:*类名:*功能描述:*处理流程:*算法:*姓名:*日期:*修改:*日期:*错误编号:*备注:*版本:*************************************************************/程序注释的原则–注释应当浅显、明白–注释不是程序员指南–注释不是标准库函数参考手册–注释的主要任务是答疑解惑而不是增加程序的行数–好的注释是对设计思想的精确表述和清晰展现第五章安全编码285.2.2若干建议某些“自由的”语言更容易引发内存错误(如C/C++)要避免产品中出现内存错误,好的编码规范、所选的语言和工具、有效的测试等工作都是有意义的第五章安全编码29内存分配方式从静态存储区域分配:内存在编译时已分配好,在程序的整个运行期间都存在。例如:全局变量、静态变量等。在堆栈上创建:在函数执行期间,函数内的局部变量(包括形参)的存储单元都创建在堆栈上,函数结束时这些存储单元自动释放(堆栈清退)。从堆(heap)上分配,也称动态内存分配:程序运行期间用malloc或new申请任意数量的内存,程序员自己掌握释放内存的恰当时机(使用free或delete)。第五章安全编码305.2.2若干建议断言(assert)的用法是受限制的,其根本原因在于断言内部的语句在软件的发布版本(Release版)中将变成空语句,不起任何作用;宏定义的优点和缺点同样明显,这种情况下,程序员需要趋利弊害,择善而从。改进算法可以显著提高速度将代码和数据保存在更快的介质上同样可以显著提高速度编译优化选项并不总能提高速度第五章安全编码315.3代码审核常见的软件编码漏洞源码审查第五章安全编码325.3.1常见的软件编码漏洞输入检测机制例外处理机制缓冲区溢出SQL注入竞争条件第五章安全编码33输入检测机制输入参数的合法性检查使用白名单第五章安全编码34例外处理机制处理意料之外的事件使用条件判断第五章安全编码35缓冲区溢出防止写缓冲区越界添加检测机制第五章安全编码36SQL注入防止执行非法SQL语句从用户访问接口中删除SQL语句执行机制第五章安全编码37竞争条件避免因未处理死循环、死锁、资源冲突或处理不当造成软件漏洞信号量互斥关键段第五章安全编码385.3.2源码审查静态代码分析工具计量分析代码分析过程图第五章安全编码39静态代码分析工具PVS-StudioCheckstyleFindBugsPMDJtestPC-LINT该网址收录了目前基本上所有的静态代码分析工具,其中(HP)Fortify对软件安全方面的分析较好。第五章安全编码41计量分析步骤如下:推导出适合代码审查的数字量绝对量:代码的特征如:代码行数、特定变量的引用次数、软件故障的概率相对量:如:测试特定漏洞的困难程度将数字量与安全方针、历史数据比较如:每1000行代码出现的漏洞数量分析代码以改善代码的质量第五章安全编码42代码分析过程图见BSI网站第五章安全编码43谢谢