第一章 总则
第一条 武汉学院为提高软件代码开发的安全性,增强系统的稳定性,降低软件维护和升级的成本,控制信息系统开发和运行风险,特制定本规范。
第二章 适用范围
第二条 本规范适用于为武汉学院自主开发软件或后续开发软件的开发人员。
第三章 基本要求
第三条 程序开发应保证代码质量、可移植性、可读性和可测性,采取有效的控制方法和测试方法进行质量控制。
第四条 程序应采用统一的文件编码格式和存储格式,并对程序的注释、组成、规则、实现采用统一的代码风格与排版。
第五条 程序开发中应考虑安全性,防止缓冲区溢出、对输入输出进行控制并以最小权限开发程序。对于程序关键部分代码,特别是敏感和重要的信息应尽可能地采用加密方式防止恶意分析和修改。
第六条 开发人员应保证工程中不存在无用的资源(如代码、图片文件等)。
第七条 代码中每个类名上的注释必须留下创建者和修改者的名字。
第八条 产品中不要包含后门代码,隔离系统中的后门代码,确保其不能出现在产品中。作为一种特殊的调试代码,后门访问代码是为了使开发者和测试工程师访问一部分终端用户不能访问的程序代码。但是,如果后门代码被留到产品中,对攻击者来说,它就是一条不需要通过正常安全手段来攻陷系统的通路。
第四章 JAVA代码开发
第九条 对于重要的线程,程序应有自检机制,一旦出现问题,能够自行恢复。
第十条 程序中的每个线程都应指定线程名称,当发生错误时,开发人员可以通过名称确认发生错误的代码。
第十一条 对频繁创建和调度的线程,开发人员可以使用线程池。
第十二条 每个需要import的类都应使用一行import声明,不得使用import xxx.*。
第十三条 System.out.println()仅在调试时使用,正式代码里不应出现。
第十四条 开发人员编写代码时,应遵循以下命名规则:
(一)Package 名称应该都是由一组小写字母组成;
(二)Class 名称中的每个单词的首字母必须大写;
(三)Static Final 变量的名称全用大写,并且名称后加注释;
(四)参数的名称必须和变量的命名规范一致;
(五)使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名称。
第十五条 代码应该用unix的格式,而不是windows的。
第十六条 exit 除了在 main 中可以被调用外,其他的地方不应被调用。
第十七条 代码中应尽量使用interfaces,不要使用abstract类。
第十八条 涉及HTML的文档,尽量使用XHTML1.0 transitional文件类型,其中所有HTML标签都应关闭。
第十九条 在HTML、JavaScript、XML代码中,缩进应为两个空格,不得使用Tab。
第二十条 HTML标签的name和id属性的命名方式应与Java变量名相同。
第二十一条 在需要经常创建开销较大的对象时,开发人员应考虑使用对象池。
第二十二条 在进行log的获取时开发人员应尽量使用isXXXEnabled。
第二十三条 log的生成环境上尽量避免输出文件名和行号。
第五章 C++代码开发
第二十四条 程序应尽量减少使用宏定义,尽可能使用常量或内联函数来替代宏。
第二十五条 程序开发中应尽量使用操作系统和标准库中的安全版本的函数。
第二十六条 变量/指针在使用前就必须初始化。
第二十七条 对用户提交变量的长度进行验证后再使用,防止溢出。
第二十八条 对防止指针/数组类型数据长度进行验证后再使用,防止操作越界。
第二十九条 使用无符号整数,或者注意考虑算术表达式的每一项以避免整数溢出。
第三十条 及时、正确地释放内存资源,防止内存泄露。
第三十一条 输出字符串内容时,正确指定输出格式,防止格式化字符串漏洞的产生。
第三十二条 使用SqlCommand类及SqlCommand类的Parameters.Add()方法避免SQL注入。
第三十三条 对用户输入参数进行验证,对输出使用HTML编码避免跨站脚本漏洞(Cross-Site Scripting)。
第六章 数据库代码开发
第三十四条 开发人员应尽量使用PreparedStatement,并且使用占位符?来表示参数。在使用set命令时,数据库驱动程序会对参数中的关键字进行转义。严格禁止将参数和SQL语句做拼接。
第三十五条 数据库关闭的原则是:谁创建的资源,谁负责关闭。当使用JDBC操作数据库时,涉及资源ResultSet、Statement、Connection等必须及时关闭。
第三十六条 ResultSet、PreparedStatement、Connection必须依次关闭,同时三者的close方法都应提示异常,且每个close方法都必须用try、catch来实现。
第三十七条 应在try代码块中及时关闭数据库资源,同时finally的代码块中也要关闭资源,或者将一个try代码块拆分为多个try代码块,保证每个资源都能在使用完以后立即关闭。
第三十八条 数据库表名、字段名必须大写。
第三十九条 对于返回较大结果集的查询,必须禁止SELECT *,在其他查询中也应避免使用。
第四十条 编写可以移植的SQL语句,原则如下:
(一)不得使用某个数据库专用的关键字、函数等;
(二)当必须要使用某个数据库特定的特性时,需在程序运行时,先判断当前数据库的类型,然后再根据数据的不同使用其特性;
(三)可以使用各种数据库都支持的函数包括MIN、MAX、AVG、COUNT;
(四)尽量使用简单的SQL语句,当因为特殊情况需要使用非常见SQL语句时,应该在多种数据库下测试。
第四十一条 优化SQL语句时,开发人员应遵循以下原则:
(一) 使用合适的SQL语句以避免不必要的关联;
(二) 使用JDBC批量更新来优化insert和update的性能;
(三) 必要时可以使用对象缓存技术,但是技术方案需要通过讨论并且获得批准后方可执行。
(四) 不得将数据库的用户名和密码以明文形式存储在配置文件中。
(五) 只给数据库用户授予其需要的最小权限,以保障数据库服务器的安全。
第七章 WEB代码开发
第四十二条 在HTML中,一些特殊字符在页面上显示时必须转义。
第四十三条 验证所有由Web页面提交的数据,包括输入数据的长度、取值范围、内容等。
第四十四条 由Web页面提交的数据应在客户端和服务器端同时验证。
第四十五条 用户界面须支持主流浏览器,避免因某类浏览器的安全问题或者在